"""Dossier readiness and missing-document generation schemas."""

from __future__ import annotations

from typing import Any

from pydantic import BaseModel, Field


class DossierDocumentIndexItem(BaseModel):
    """Indexed document details for a present dossier item."""

    document_type: str
    source_filename: str
    doc_stage: str
    doc_family: Any | None = None
    task_type: Any | None = None
    readiness_weight: float = 0.0


class DossierMissingDocumentItem(BaseModel):
    """Single missing dossier requirement."""

    document_type: str
    label: str
    critical: bool


class DossierCriticalMissingItem(BaseModel):
    """Single critical missing dossier item."""

    doc_stage: str
    document_type: str
    label: str


class DossierStageReadiness(BaseModel):
    """Readiness status for a single operational stage."""

    status: str
    score: float
    required_count: int
    available_count: int
    missing_count: int
    blocking_items: list[str] = Field(default_factory=list)


class DossierReadinessSummary(BaseModel):
    """Top-level dossier readiness summary."""

    contracting_status: str
    payment_status: str
    finalization_status: str
    critical_missing_count: int


class DossierReadinessResponse(BaseModel):
    """Combined dossier readiness report payload."""

    project_code: str
    documents_present: dict[str, list[str]] = Field(default_factory=dict)
    document_index: dict[str, DossierDocumentIndexItem] = Field(default_factory=dict)
    documents_missing: dict[str, list[DossierMissingDocumentItem]] = Field(
        default_factory=dict
    )
    critical_missing: list[DossierCriticalMissingItem] = Field(default_factory=list)
    readiness: dict[str, DossierStageReadiness] = Field(default_factory=dict)
    summary: DossierReadinessSummary


class MissingDocumentGenerationRequest(BaseModel):
    """Request payload để tạo scaffold hồ sơ còn thiếu."""

    project_code: str = Field(..., min_length=1)
    missing_document_types: list[str] = Field(default_factory=list)


class MissingDocumentRequiredInputItem(BaseModel):
    """Một trường dữ liệu còn cần bổ sung trước khi render hồ sơ."""

    field_name: str
    status: str
    label: str
    example_value: str | None = None


class MissingDocumentOutputInfo(BaseModel):
    """Thông tin file đầu ra dự kiến cho scaffold hồ sơ."""

    file_name: str
    file_extension: str
    mime_type: str


class MissingDocumentTemplateInfo(BaseModel):
    """Metadata template/generator dùng cho scaffold hồ sơ."""

    generator_type: str
    template_key: str | None = None
    sections: list[str] = Field(default_factory=list)


class MissingDocumentPayloadMetadata(BaseModel):
    """Metadata phục vụ theo dõi bundle generation."""

    generated_at: str
    generation_mode: str
    source: str


class MissingDocumentPlaceholderPayload(BaseModel):
    """Payload structured an toàn để parent agent render hoặc ghi file sau."""

    project_code: str
    document_type: str
    document_label: str
    doc_stage: str
    critical: bool
    output: MissingDocumentOutputInfo
    template: MissingDocumentTemplateInfo
    required_inputs: list[MissingDocumentRequiredInputItem] = Field(
        default_factory=list
    )
    placeholders: dict[str, str] = Field(default_factory=dict)
    metadata: MissingDocumentPayloadMetadata


class MissingDocumentGenerationItem(BaseModel):
    """Một scaffold hồ sơ còn thiếu kèm nội dung placeholder."""

    document_type: str
    label: str
    doc_stage: str
    critical: bool
    generation_order: int
    generator_type: str
    output_format: str
    mime_type: str
    output_filename: str
    output_path: str
    template_key: str | None = None
    required_inputs: list[str] = Field(default_factory=list)
    sections: list[str] = Field(default_factory=list)
    notes: str | None = None
    placeholder_payload: MissingDocumentPlaceholderPayload
    placeholder_content: str


class MissingDocumentPlanItem(BaseModel):
    """Checklist hành động tiếp theo cho từng hồ sơ scaffold."""

    document_type: str
    doc_stage: str
    priority: str
    next_action: str
    output_path: str


class MissingDocumentGenerationSummary(BaseModel):
    """Tóm tắt nhanh bundle generation hồ sơ còn thiếu."""

    critical_documents: int
    normal_documents: int
    message: str


class MissingDocumentGenerationResponse(BaseModel):
    """Response bundle scaffold cho danh sách hồ sơ còn thiếu."""

    project_code: str
    generated_at: str
    total_missing_documents: int
    stage_counts: dict[str, int] = Field(default_factory=dict)
    plan: list[MissingDocumentPlanItem] = Field(default_factory=list)
    documents: list[MissingDocumentGenerationItem] = Field(default_factory=list)
    summary: MissingDocumentGenerationSummary
