from datetime import datetime
from uuid import UUID, uuid4
from pydantic import BaseModel, Field

class ProjectBudget(BaseModel):
    """
    Domain Entity đại diện cho Ngân sách của một Dự án (Phân hệ Financial).
    Bản thân nó độc lập với Project Entity bên phân hệ Projects.
    Nó chỉ lưu lại project_id như một Foreign Key ảo.
    """
    id: UUID = Field(default_factory=uuid4)
    project_id: UUID
    project_code: str
    total_allocated: float = 0.0
    status: str = "INITIALIZED"
    created_at: datetime = Field(default_factory=datetime.utcnow)
    
    def allocate_funds(self, amount: float):
        if amount <= 0:
            raise ValueError("Số tiền cấp phát phải lớn hơn 0")
        self.total_allocated += amount
        self.status = "FUNDED"

    def lock_funds(self, amount: float):
        """[D6] Domain logic: Đóng băng tiền để giải ngân."""
        if amount <= 0:
            raise ValueError("Số tiền giải ngân phải lớn hơn 0")
        if self.total_allocated < amount:
            self.status = "FROZEN_OVER_BUDGET"
            raise ValueError(f"Ngân sách dự án không đủ để giải ngân {amount}. Đã khóa trạng thái FROZEN_OVER_BUDGET.")
            
        self.total_allocated -= amount
