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

class Partner(BaseModel):
    """
    Domain Entity đại diện cho Đối tác (Nhà cung cấp, Thầu phụ, Chủ đầu tư).
    Tuyệt đối không chứa logic của ORM/SQLAlchemy.
    """
    id: UUID = Field(default_factory=uuid4)
    name: str = Field(..., min_length=2, max_length=255)
    tax_code: Optional[str] = Field(None, description="Mã số thuế")
    type: str = Field("SUPPLIER", description="Loại đối tác: SUPPLIER, SUBCONTRACTOR, CLIENT")
    address: Optional[str] = None
    created_at: datetime = Field(default_factory=datetime.utcnow)

    @model_validator(mode='after')
    def validate_rules(self) -> 'Partner':
        # Business Rule: Chỉ chấp nhận 3 loại đối tác cố định
        valid_types = {"SUPPLIER", "SUBCONTRACTOR", "CLIENT"}
        if self.type not in valid_types:
            raise ValueError(f"Loại đối tác '{self.type}' không hợp lệ. Phải thuộc: {valid_types}")
            
        # Business Rule: Nếu là CLIENT hoặc SUBCONTRACTOR thường bắt buộc có MST trong hệ thống xây dựng
        # (Ở đây ta tạm thời cho phép bỏ trống để linh hoạt, nhưng có thể siết chặt sau)
        return self
