"""
HRM Public Types - Module Contract.

تایپ‌های عمومی ماژول HRM برای استفاده توسط سایر ماژول‌ها.
"""
from dataclasses import dataclass, field
from datetime import date
from typing import Optional, List
from uuid import UUID


@dataclass(frozen=True)
class EmployeeSummary:
    """خلاصه اطلاعات کارمند."""
    id: UUID
    employee_code: str
    full_name: str
    full_name_en: str
    employment_status: str
    org_unit_id: Optional[UUID] = None
    position_id: Optional[UUID] = None


@dataclass(frozen=True)
class PositionSummary:
    """خلاصه اطلاعات پست."""
    id: UUID
    code: str
    title: str
    org_unit_id: Optional[UUID] = None
    is_vacant: bool = True
    incumbent_id: Optional[UUID] = None


@dataclass(frozen=True)
class LeaveBalanceSummary:
    """خلاصه مانده مرخصی."""
    employee_id: UUID
    leave_type: str
    year: int
    entitled_days: float
    used_days: float
    available_days: float


@dataclass(frozen=True)
class CompensationSummary:
    """خلاصه اطلاعات حقوقی."""
    employee_id: UUID
    base_salary: float
    total_monthly: float
    currency: str = "IRR"
    effective_date: Optional[date] = None


@dataclass(frozen=True)
class LegalEntitySummary:
    """خلاصه شخصیت حقوقی."""
    id: UUID
    name: str
    entity_type: str
    national_id: str = ""


@dataclass(frozen=True)
class LocationSummary:
    """خلاصه مکان."""
    id: UUID
    name: str
    code: str
    location_type: str
    city: str = ""
    province: str = ""


# ═══════════════════════════════════════════════════
# Enums (publicly available)
# ═══════════════════════════════════════════════════

class EmploymentStatus:
    ACTIVE = "ACTIVE"
    ON_LEAVE = "ON_LEAVE"
    SUSPENDED = "SUSPENDED"
    TERMINATED = "TERMINATED"
    RETIRED = "RETIRED"
    PROBATION = "PROBATION"


class EmploymentType:
    FULL_TIME = "FULL_TIME"
    PART_TIME = "PART_TIME"
    CONTRACT = "CONTRACT"
    INTERN = "INTERN"


class LeaveType:
    ANNUAL = "ANNUAL"
    SICK = "SICK"
    MATERNITY = "MATERNITY"
    PATERNITY = "PATERNITY"
    UNPAID = "UNPAID"
    STUDY = "STUDY"
    COMPENSATORY = "COMPENSATORY"
    BEREAVEMENT = "BEREAVEMENT"
    MARRIAGE = "MARRIAGE"
    PILGRIMAGE = "PILGRIMAGE"
    HOURLY = "HOURLY"


class PositionStatus:
    ACTIVE = "ACTIVE"
    FROZEN = "FROZEN"
    ABOLISHED = "ABOLISHED"
    PROPOSED = "PROPOSED"
