from __future__ import annotations

from pydantic import BaseModel, Field


class DossierCoverageDocumentItem(BaseModel):
    """Tài liệu đã được phân loại trong manifest coverage."""

    relative_path: str
    source_filename: str
    document_type: str
    doc_stage: str
    classification_source: str
    classification_confidence: float = 0.0


class DossierCoverageProjectItem(BaseModel):
    """Coverage payload cho một project trong manifest ingest."""

    project_code: str
    project_name: str
    project_root: str | None = None
    project_root_exists: bool = False
    total_files: int = 0
    extractable_files: int = 0
    classified_files: int = 0
    unknown_files: int = 0
    knowledge_files_ingested: int = 0
    knowledge_chunks_ingested: int = 0
    document_type_counts: dict[str, int] = Field(default_factory=dict)
    missing_document_types: list[str] = Field(default_factory=list)
    sample_unknown_files: list[str] = Field(default_factory=list)
    sample_skipped_files: list[str] = Field(default_factory=list)
    missing_files: list[str] = Field(default_factory=list)
    ingested_document_types: list[str] = Field(default_factory=list)
    stages: list[str] = Field(default_factory=list)
    documents: list[DossierCoverageDocumentItem] = Field(default_factory=list)
    readiness_gaps: list[str] = Field(default_factory=list)


class DossierCoverageResponse(BaseModel):
    """Coverage/manifest response cho một project dossier."""

    project_code: str
    ingest_batch: str | None = None
    manifest_path: str | None = None
    generated_at: str | None = None
    project: DossierCoverageProjectItem
    source: str = "manifest"
    used_fallback: bool = False
    message: str | None = None
