from pydantic import BaseModel, Field


class DashboardStatsResponse(BaseModel):
    totalSignalements: int
    signalementsNouveaux: int
    signalementsEnCours: int
    signalementsTraites: int
    signalementsCloturesAutres: int
    totalUtilisateurs: int
    totalEvenements: int
    totalMessages: int
    tauxTraitement: float  # percentage 0–100
    signalementsEnAttente: int = 0
    evenementsAVenir: int = 0
    equipeAlertes: int = 0
    moderationEnAttente: int = 0
    urgentCases: int = 0
    activeUsers: int = 0
    pendingTestimonials: int = 0
    averageResolutionDays: float = 0.0
    unreadMessagesCount: int = 0
    pendingReportsCount: int = 0
    upcomingEventsCount: int = 0
    announcements: list[dict] = Field(default_factory=list)
    pendingCasesCount: int = 0
    casesCount: int = 0
    eventsCount: int = 0
    teamAlertsCount: int = 0
    teamPendingCount: int = 0
    pendingModerationCount: int = 0
    moderationCount: int = 0


class SignalementStatsByType(BaseModel):
    type: str
    count: int
    pourcentage: float


class SignalementStatsResponse(BaseModel):
    total: int
    parStatut: dict[str, int]
    parType: list[SignalementStatsByType]
    evolution: list[dict]  # [{mois, count}]


class SystemHealthResponse(BaseModel):
    status: str
    database: str
    uptime: str
    version: str

# --- Extra schemas for /dashboard sub-endpoints ---

class TeamMemberStats(BaseModel):
    id: str
    nom: str | None
    typeUtilisateur: str
    signalementsAssignes: int
    signalementsTraites: int
    tauxTraitement: float
    tempsReponseMoyenHeures: float | None
    enLigne: bool
    derniereActivite: str | None
    photoUrl: str | None

class TeamStatsSummary(BaseModel):
    total: int
    gestionnaires: int
    utilisateurs: int
    actifs: int

class TeamStatsResponse(BaseModel):
    resume: TeamStatsSummary
    team: list[TeamMemberStats]
    teamStats: list[TeamMemberStats]
    equipe: list[TeamMemberStats]  # For compatibility

class AlertItem(BaseModel):
    id: str
    titre: str
    type: str
    statut: str
    dateCreation: str | None
    priorite: str
    title: str | None = None
    message: str | None = None
    severity: str | None = None
    createdAt: str | None = None
    isDismissed: bool = False

class AlertsResponse(BaseModel):
    alertes: list[AlertItem]
    total: int

class RecentCaseItem(BaseModel):
    id: str
    titre: str
    type: str
    statut: str
    dateCreation: str | None

class RecentCasesResponse(BaseModel):
    dossiers: list[RecentCaseItem]
    total: int

class CategoryDistributionItem(BaseModel):
    categorie: str
    nombre: int
    pourcentage: float

class CategoryDistributionResponse(BaseModel):
    distribution: list[CategoryDistributionItem]

class CasesTrendItem(BaseModel):
    semaine: str
    nombre: int

class CasesTrendsResponse(BaseModel):
    tendances: list[CasesTrendItem]

class ResolutionTrendItem(BaseModel):
    semaine: str
    total: int
    resolus: int
    en_cours: int
    nouveau: int
    tauxResolution: float

class ResolutionTrendsResponse(BaseModel):
    tendances: list[ResolutionTrendItem]

class QuickActionItem(BaseModel):
    id: str
    label: str
    iconName: str
    route: str
    badge: int | None = None
    isEnabled: bool = True
    icon: str | None = None
    url: str | None = None
    count: int | None = None

class QuickActionsResponse(BaseModel):
    actions: list[QuickActionItem]


class InvitationPendingStatsResponse(BaseModel):
    invitationsEnAttente: int
    pendingInvitations: int
