from __future__ import annotations

from typing import Literal

from pydantic import BaseModel, Field

from .generation_enums import (
    GenerationFieldStatus,
    GenerationOrganizationInfo,
    GenerationReadinessStatus,
    GenerationReviewWorkflowStatus,
    GenerationSignatoryInfo,
    GenerationTemplateRegistryEntry,
)


class BienBanBanGiaoMatBangGenerationPayload(BaseModel):
    """Payload pilot cho biên bản bàn giao mặt bằng phục vụ generation workflow."""

    document_type: Literal["bien_ban_ban_giao_mat_bang"] = Field(
        "bien_ban_ban_giao_mat_bang",
        description="Loại hồ sơ pilot cần sinh",
    )
    template: GenerationTemplateRegistryEntry = Field(
        ...,
        description="Thông tin template đang được áp dụng",
    )
    project_name: str | None = Field(None, description="Tên dự án")
    dossier_code: str | None = Field(None, description="Mã hồ sơ nội bộ")
    handover_date_text: str | None = Field(
        None,
        description="Ngày bàn giao đã định dạng để đưa vào văn bản",
    )
    handover_location: str | None = Field(None, description="Địa điểm bàn giao")
    site_description: str | None = Field(None, description="Mô tả mặt bằng bàn giao")
    receiving_organization: GenerationOrganizationInfo | None = Field(
        None,
        description="Tổ chức nhận bàn giao",
    )
    handing_over_organization: GenerationOrganizationInfo | None = Field(
        None,
        description="Tổ chức bàn giao",
    )
    receiving_signatory: GenerationSignatoryInfo | None = Field(
        None,
        description="Người ký phía nhận bàn giao",
    )
    handing_over_signatory: GenerationSignatoryInfo | None = Field(
        None,
        description="Người ký phía bàn giao",
    )
    field_statuses: list[GenerationFieldStatus] = Field(
        default_factory=list,
        description="Danh sách trạng thái chi tiết của từng trường dữ liệu phục vụ generation",
    )
    readiness: GenerationReadinessStatus = Field(
        ...,
        description="Trạng thái sẵn sàng hiện tại của payload generation",
    )
    review_workflow: GenerationReviewWorkflowStatus = Field(
        ...,
        description="Trạng thái review hiện tại của hồ sơ generation",
    )
    extra_context: dict[str, str | int | float | bool | None] = Field(
        default_factory=dict,
        description="Ngữ cảnh bổ sung theo từng template hoặc từng hồ sơ cụ thể",
    )


class BienBanBanGiaoMatBangGenerationPreviewResponse(BaseModel):
    """Response nội bộ cho reviewer UI khi preview payload generation pilot."""

    payload: BienBanBanGiaoMatBangGenerationPayload = Field(
        ...,
        description="Payload generation pilot đã được assembler chuẩn hóa",
    )
    field_statuses: list[GenerationFieldStatus] = Field(
        default_factory=list,
        description="Danh sách trạng thái field tách riêng để UI truy cập trực tiếp",
    )
    readiness: GenerationReadinessStatus = Field(
        ...,
        description="Trạng thái sẵn sàng tổng hợp cho payload preview",
    )
    active_template: GenerationTemplateRegistryEntry = Field(
        ...,
        description="Template active đang được dùng để build preview",
    )
    review_workflow: GenerationReviewWorkflowStatus | None = Field(
        None,
        description="Snapshot trạng thái review hiện tại, tiện cho reviewer UI",
    )
    source_project_code: str | None = Field(
        None,
        description="Mã dự án nguồn nếu preview được build từ project thực tế",
    )
    source_note: str | None = Field(
        None,
        description="Ghi chú ngắn mô tả nguồn dữ liệu hoặc chế độ preview hiện tại",
    )


BienBanBanGiaoMatBangGenerationPayload.model_rebuild()
BienBanBanGiaoMatBangGenerationPreviewResponse.model_rebuild()
