from datetime import datetime

from pydantic import BaseModel


# ── Requests ──────────────────────────────────────────────────────────────────

class SignalementCreate(BaseModel):
    titre: str
    description: str
    type: str
    modeIdentification: str = "ANONYME"
    dateIncident: datetime | None = None
    lieuIncident: str | None = None
    auteurPresume: str | None = None
    aTemoins: bool | None = None
    descriptionTemoins: str | None = None
    bureauGenreId: str | None = None
    piecesJointes: list[dict] | None = None


class SignalementUpdateStatut(BaseModel):
    statut: str


class SignalementAssign(BaseModel):
    gestionnaireId: str


class NoteInterneCreate(BaseModel):
    contenu: str


# ── Nested responses ──────────────────────────────────────────────────────────

class PieceJointeResponse(BaseModel):
    id: str
    nomFichier: str
    typeFichier: str
    tailleFichier: int
    url: str | None = None
    filepath: str | None = None
    fileServerId: str | None = None
    dateUpload: datetime


class NoteInterneResponse(BaseModel):
    id: str
    auteurId: str | None = None
    sourceActeur: str | None = None
    acteurId: str | None = None
    contenu: str
    dateCreation: datetime


class TimelineEventResponse(BaseModel):
    id: str
    typeEvenement: str
    description: str
    timestamp: datetime
    sourceActeur: str | None = None
    acteurId: str | None = None
    effectueParNom: str | None = None
    valeurPrecedente: str | None = None
    nouvelleValeur: str | None = None


# ── Main responses ────────────────────────────────────────────────────────────

class SignalementResponse(BaseModel):
    id: str
    reference: str
    titre: str
    description: str
    type: str
    statut: str
    estTraite: bool
    modeIdentification: str
    priorite: str | None = None
    dateIncident: datetime | None = None
    lieuIncident: str | None = None
    auteurPresume: str | None = None
    aTemoins: bool | None = None
    descriptionTemoins: str | None = None
    utilisateurId: str | None = None
    sourceActeur: str | None = None
    acteurId: str | None = None
    estFusionne: bool | None = None
    gestionnaireId: str | None = None
    gestionnaireNom: str | None = None
    bureauGenreId: str | None = None
    piecesJointes: list[PieceJointeResponse] = []
    dateCreation: datetime
    dateModification: datetime | None = None
    dateTraitement: datetime | None = None
    dateAssignation: datetime | None = None
    hasUnreadUpdates: bool = False
    messagesNonLusCount: int = 0


class SignalementListResponse(BaseModel):
    id: str
    reference: str
    titre: str
    type: str
    statut: str
    estTraite: bool
    utilisateurId: str | None = None
    sourceActeur: str | None = None
    acteurId: str | None = None
    estFusionne: bool | None = None
    gestionnaireId: str | None = None
    gestionnaireNom: str | None = None
    dateCreation: datetime
    dateModification: datetime | None = None
    hasUnreadUpdates: bool = False
    messagesNonLusCount: int = 0
