"""
Employment Record - Domain Entity

سوابق استخدامی و قراردادهای کارمند.
"""
from dataclasses import dataclass, field
from datetime import date
from typing import Optional
from uuid import UUID

from shared.base_classes.entity import TenantEntity


class ContractType:
    """انواع قرارداد."""
    PERMANENT = "PERMANENT"
    TEMPORARY = "TEMPORARY"
    FIXED_TERM = "FIXED_TERM"
    PROJECT_BASED = "PROJECT_BASED"
    INTERNSHIP = "INTERNSHIP"
    CONSULTANCY = "CONSULTANCY"


@dataclass
class EmploymentRecord(TenantEntity):
    """
    سابقه استخدامی - قرارداد و دوره کاری.

    Rules:
    - هر کارمند می‌تواند چند سابقه داشته باشد
    - تاریخ پایان باید بعد از تاریخ شروع باشد
    - فقط یک قرارداد فعال در هر لحظه
    """

    employee_id: UUID = field(default_factory=lambda: None)
    contract_type: str = ContractType.PERMANENT
    contract_number: str = ""
    start_date: Optional[date] = None
    end_date: Optional[date] = None
    title: str = ""
    department: str = ""
    org_unit_id: Optional[UUID] = None
    position_id: Optional[UUID] = None
    legal_entity_id: Optional[UUID] = None
    is_current: bool = True
    termination_reason: str = ""
    notes: str = ""
    metadata: dict = field(default_factory=dict)

    def validate(self) -> None:
        """اعتبارسنجی."""
        if not self.employee_id:
            raise ValueError("شناسه کارمند الزامی است")
        if not self.start_date:
            raise ValueError("تاریخ شروع الزامی است")
        if self.end_date and self.end_date < self.start_date:
            raise ValueError("تاریخ پایان نمی‌تواند قبل از تاریخ شروع باشد")

    def end_contract(self, end_date: date, reason: str = "") -> None:
        """پایان قرارداد."""
        if not self.is_current:
            raise ValueError("این قرارداد قبلاً پایان یافته است")
        self.end_date = end_date
        self.is_current = False
        self.termination_reason = reason
        self.mark_updated()


@dataclass
class EmployeeDocument(TenantEntity):
    """
    مدارک کارمند.

    Rules:
    - هر مدرک باید نوع و شناسه کارمند داشته باشد
    - تاریخ انقضا برای مدارک دارای اعتبار
    """

    employee_id: UUID = field(default_factory=lambda: None)
    document_type: str = ""  # NATIONAL_CARD, BIRTH_CERT, DIPLOMA, CONTRACT, LICENSE, etc.
    title: str = ""
    document_number: str = ""
    issue_date: Optional[date] = None
    expiry_date: Optional[date] = None
    file_path: str = ""
    file_size: int = 0
    mime_type: str = ""
    is_verified: bool = False
    verified_by: Optional[UUID] = None
    notes: str = ""
    metadata: dict = field(default_factory=dict)

    def validate(self) -> None:
        """اعتبارسنجی."""
        if not self.employee_id:
            raise ValueError("شناسه کارمند الزامی است")
        if not self.document_type:
            raise ValueError("نوع مدرک الزامی است")
        if not self.title:
            raise ValueError("عنوان مدرک الزامی است")

    def is_expired(self) -> bool:
        """بررسی انقضا."""
        if not self.expiry_date:
            return False
        return self.expiry_date < date.today()

    def verify(self, verifier_id: UUID) -> None:
        """تأیید مدرک."""
        self.is_verified = True
        self.verified_by = verifier_id
        self.mark_updated()
