from __future__ import annotations

from typing import Any

from pydantic import BaseModel, Field

from app.models.schema_constants import (
    DOSSIER_REVIEW_ASSIGNMENT_STATUSES,
    DOSSIER_REVIEW_DEPARTMENT_CODES,
)


class DossierReviewEvidenceItem(BaseModel):
    """Evidence or rationale attached to a dossier review finding."""

    evidence_type: str
    source_name: str | None = None
    source_uri: str | None = None
    source_page: str | None = None
    excerpt: str | None = None
    rule_code: str | None = None
    rationale: str | None = None
    confidence_score: float | None = None
    evidence_payload: dict[str, Any] = Field(default_factory=dict)


class DossierReviewSubmissionItem(BaseModel):
    """Single supplement submission attached to an assignment or finding."""

    submission_id: str
    submission_type: str
    submitted_by_employee_code: str | None = None
    submitted_by_employee_name: str | None = None
    submission_note: str | None = None
    attachment_count: int = 0
    submitted_payload: dict[str, Any] = Field(default_factory=dict)
    verification_result: str | None = None
    verification_note: str | None = None
    verified_by_employee_code: str | None = None
    verified_by_employee_name: str | None = None
    verified_at: str | None = None
    created_at: str


class DossierReviewAssignmentItem(BaseModel):
    """Assignment routing a dossier finding to a responsible department."""

    assignment_id: str
    assigned_department_code: str = Field(
        ...,
        description=f"One of: {', '.join(DOSSIER_REVIEW_DEPARTMENT_CODES)}",
    )
    assigned_employee_code: str | None = None
    assigned_employee_name: str | None = None
    assigned_by_employee_code: str | None = None
    assigned_by_employee_name: str | None = None
    status: str = Field(
        ...,
        description=f"One of: {', '.join(DOSSIER_REVIEW_ASSIGNMENT_STATUSES)}",
    )
    priority: str
    due_date: str | None = None
    assignment_note: str | None = None
    latest_submission_note: str | None = None
    accepted_at: str | None = None
    submitted_at: str | None = None
    verified_at: str | None = None
    closed_at: str | None = None
    submissions: list[DossierReviewSubmissionItem] = Field(default_factory=list)
    metadata: dict[str, Any] = Field(default_factory=dict)
