from __future__ import annotations

from pydantic import BaseModel, Field


class DocumentReference(BaseModel):
    """Tham chiếu đến tài liệu nguồn."""

    document_type: str
    document_code: str | None = None
    title: str
    source_file: str | None = None
    issue_date: str | None = None


class ParticipantProfile(BaseModel):
    """Thông tin đơn vị liên quan."""

    name: str
    role: str
    tax_code: str | None = None
    address: str | None = None


class ApprovalDecision(BaseModel):
    """Thông tin quyết định phê duyệt."""

    decision_no: str
    issue_date: str | None = None
    authority_name: str | None = None
    summary: str | None = None


class ProjectProfile(BaseModel):
    """Thông tin chung dự án."""

    project_id: str
    project_code: str
    project_name: str
    investor_name: str | None = None
    approval_decisions: list[ApprovalDecision] = Field(default_factory=list)


class PackageProfile(BaseModel):
    """Thông tin gói thầu."""

    package_id: str
    package_code: str
    package_name: str
    procurement_method: str | None = None
    approved_value: float | None = None


class ContractProfile(BaseModel):
    """Thông tin hợp đồng."""

    contract_id: str
    contract_code: str
    contract_name: str
    contractor: ParticipantProfile | None = None
    contract_value: float | None = None
    signed_date: str | None = None
    contract_type: str | None = None


class PaymentRequestDossier(BaseModel):
    """Hồ sơ đề nghị thanh toán."""

    dossier_id: str
    project: ProjectProfile
    package: PackageProfile
    contract: ContractProfile
    references: list[DocumentReference] = Field(default_factory=list)
    requested_amount: float | None = None
    payment_stage: str | None = None


class SettlementDossier(BaseModel):
    """Hồ sơ quyết toán."""

    dossier_id: str
    project: ProjectProfile
    package: PackageProfile
    contract: ContractProfile
    references: list[DocumentReference] = Field(default_factory=list)
    settlement_value: float | None = None


class AuditWorkingPaper(BaseModel):
    """Phiếu làm việc kiểm toán/kiểm tra."""

    paper_id: str
    project_code: str
    contract_code: str | None = None
    findings: list[str] = Field(default_factory=list)
    recommendations: list[str] = Field(default_factory=list)
