from __future__ import annotations

from typing import Any

from pydantic import BaseModel, Field

from app.models.schema_constants import (
    DOSSIER_REVIEW_DEPARTMENT_CODES,
    DOSSIER_REVIEW_FINDING_STATUSES,
    DOSSIER_REVIEW_SUPPLEMENT_STATUSES,
)

from .dossier_evidence_models import (
    DossierReviewAssignmentItem,
    DossierReviewEvidenceItem,
)


class DossierReviewFindingItem(BaseModel):
    """Single dossier review finding, including routing and evidence."""

    finding_id: str
    finding_code: str
    finding_group: str
    finding_type: str
    title: str
    description: str | None = None
    document_type: str | None = None
    dossier_stage: str | None = None
    severity: str
    impact_level: str
    responsible_department_code: str = Field(
        ...,
        description=f"One of: {', '.join(DOSSIER_REVIEW_DEPARTMENT_CODES)}",
    )
    supplement_status: str = Field(
        ...,
        description=f"One of: {', '.join(DOSSIER_REVIEW_SUPPLEMENT_STATUSES)}",
    )
    status: str = Field(
        ...,
        description=f"One of: {', '.join(DOSSIER_REVIEW_FINDING_STATUSES)}",
    )
    is_blocking: bool = False
    due_date: str | None = None
    detected_at: str
    resolved_at: str | None = None
    resolution_note: str | None = None
    evidences: list[DossierReviewEvidenceItem] = Field(default_factory=list)
    assignments: list[DossierReviewAssignmentItem] = Field(default_factory=list)
    metadata: dict[str, Any] = Field(default_factory=dict)


class DossierReviewFindingCreateRequest(BaseModel):
    """Structured request payload to create one dossier review finding."""

    finding_code: str
    finding_group: str
    finding_type: str
    title: str
    description: str | None = None
    document_type: str | None = None
    dossier_stage: str | None = None
    severity: str = "medium"
    impact_level: str = "medium"
    responsible_department_code: str = Field(
        default="synthesis",
        description=f"One of: {', '.join(DOSSIER_REVIEW_DEPARTMENT_CODES)}",
    )
    supplement_status: str = Field(
        default="requested",
        description=f"One of: {', '.join(DOSSIER_REVIEW_SUPPLEMENT_STATUSES)}",
    )
    status: str = Field(
        default="open",
        description=f"One of: {', '.join(DOSSIER_REVIEW_FINDING_STATUSES)}",
    )
    is_blocking: bool = False
    due_date: str | None = None
    source_snapshot_id: str | None = None
    evidences: list[DossierReviewEvidenceItem] = Field(default_factory=list)
    metadata: dict[str, Any] = Field(default_factory=dict)
