"""
Schemi Pydantic per Fascicolo (fascicolazione pratiche).
"""

import uuid
from datetime import datetime
from typing import Optional

from pydantic import BaseModel, Field


# ─── Schemi base ──────────────────────────────────────────────────────────────

class FascicoloCreate(BaseModel):
    titolo: str = Field(..., min_length=1, max_length=255)
    numero_pratica: Optional[str] = Field(None, max_length=100)
    stato: Optional[str] = Field("aperto", pattern=r"^(aperto|chiuso|archiviato)$")
    categoria: Optional[str] = Field(None, max_length=100)
    responsabile_id: Optional[uuid.UUID] = None
    scadenza: Optional[datetime] = None
    note: Optional[str] = None


class FascicoloUpdate(BaseModel):
    titolo: Optional[str] = Field(None, min_length=1, max_length=255)
    numero_pratica: Optional[str] = Field(None, max_length=100)
    stato: Optional[str] = Field(None, pattern=r"^(aperto|chiuso|archiviato)$")
    categoria: Optional[str] = Field(None, max_length=100)
    responsabile_id: Optional[uuid.UUID] = None
    scadenza: Optional[datetime] = None
    note: Optional[str] = None


class FascicoloResponse(BaseModel):
    id: uuid.UUID
    tenant_id: uuid.UUID
    titolo: str
    numero_pratica: Optional[str] = None
    stato: str
    categoria: Optional[str] = None
    responsabile_id: Optional[uuid.UUID] = None
    scadenza: Optional[datetime] = None
    note: Optional[str] = None
    created_by: Optional[uuid.UUID] = None
    created_at: datetime
    updated_at: datetime
    message_count: int = 0

    model_config = {"from_attributes": True}


# ─── Messaggi nel fascicolo ───────────────────────────────────────────────────

class FascicoloMessageItem(BaseModel):
    """Riepilogo di un messaggio nel fascicolo."""
    id: uuid.UUID
    subject: Optional[str] = None
    from_address: Optional[str] = None
    to_addresses: Optional[list[str]] = None
    direction: str
    pec_type: str
    state: str
    mailbox_id: uuid.UUID
    received_at: Optional[datetime] = None
    sent_at: Optional[datetime] = None
    created_at: datetime
    added_at: datetime

    model_config = {"from_attributes": True}


# ─── Operazioni sui messaggi del fascicolo ────────────────────────────────────

class FascicoloAddMessagesRequest(BaseModel):
    message_ids: list[uuid.UUID] = Field(..., min_length=1)


class FascicoloRemoveMessagesRequest(BaseModel):
    message_ids: list[uuid.UUID] = Field(..., min_length=1)


# ─── Lista fascicoli di un messaggio ─────────────────────────────────────────

class MessageFascicoloSummary(BaseModel):
    """Fascicolo sintetico per la vista nel dettaglio messaggio."""
    id: uuid.UUID
    titolo: str
    numero_pratica: Optional[str] = None
    stato: str
    categoria: Optional[str] = None

    model_config = {"from_attributes": True}
