from uuid import UUID, uuid4
from datetime import date, datetime
from decimal import Decimal
from pydantic import BaseModel, Field, model_validator
from typing import Optional

class Invoice(BaseModel):
    """
    Domain Entity đại diện cho Hóa đơn (Invoices).
    Áp dụng Rule Decimal(18,4) cho độ chính xác số học tài chính.
    """
    id: UUID = Field(default_factory=uuid4)
    invoice_no: str = Field(..., min_length=1)
    supplier_tax_code: str
    # Bắt buộc dùng Decimal cho tiền tệ
    total_amount: Decimal = Field(default=Decimal("0.0000"))
    tax_amount: Decimal = Field(default=Decimal("0.0000"))
    issue_date: date
    status: str = Field("PENDING", description="PENDING, PAID, REJECTED")
    project_id: Optional[UUID] = None
    created_at: datetime = Field(default_factory=datetime.utcnow)

    @model_validator(mode='after')
    def validate_amounts(self) -> 'Invoice':
        if self.total_amount < 0 or self.tax_amount < 0:
            raise ValueError("Số tiền hóa đơn và tiền thuế không được âm.")
        if self.tax_amount > self.total_amount:
            raise ValueError("Tiền thuế không thể lớn hơn tổng tiền hóa đơn.")
        return self
