"""Schemas for Interim Payment Certificate (IPC) Export (Mẫu 03a/03b NĐ 206/2026/NĐ-CP)."""

from __future__ import annotations

from datetime import date, datetime
from decimal import Decimal

from pydantic import BaseModel, Field


class IPCItem03a(BaseModel):
    item_order: int
    wbs_code: str
    work_name: str
    unit: str
    contract_qty: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    unit_price: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    contract_amount: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    accumulated_prev_qty: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    period_qty: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    accumulated_total_qty: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    accumulated_total_amount: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    completion_rate_pct: Decimal = Field(default_factory=lambda: Decimal("0.0000"))


class IPCExport03aResponse(BaseModel):
    project_code: str
    project_name: str
    contract_number: str
    contract_date: str
    client_name: str
    contractor_name: str = "CÔNG TY TNHH XÂY DỰNG ĐỊNH SƠN"
    period_number: int  # Đợt thanh toán số N
    period_cutoff_date: date
    currency: str = "VND"
    legal_basis: str = "Nghị định số 206/2026/NĐ-CP & Luật Xây dựng số 135/2025/QH15"

    total_contract_value: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    total_period_value_pre_tax: Decimal = Field(
        default_factory=lambda: Decimal("0.0000")
    )
    advance_recovery_rate_pct: Decimal = Field(
        default_factory=lambda: Decimal("10.0000")
    )
    advance_recovered_period: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    retention_rate_pct: Decimal = Field(default_factory=lambda: Decimal("5.0000"))
    retention_deducted_period: Decimal = Field(
        default_factory=lambda: Decimal("0.0000")
    )
    net_payable_period_pre_tax: Decimal = Field(
        default_factory=lambda: Decimal("0.0000")
    )
    vat_rate_pct: Decimal = Field(default_factory=lambda: Decimal("8.0000"))
    vat_amount_period: Decimal = Field(default_factory=lambda: Decimal("0.0000"))
    total_net_payable_period: Decimal = Field(default_factory=lambda: Decimal("0.0000"))

    items: list[IPCItem03a] = Field(default_factory=list)
    generated_at: datetime
