"""
HRM Public Commands - Module Contract.

دستورات عمومی ماژول HRM که سایر ماژول‌ها می‌توانند فراخوانی کنند.
"""
from dataclasses import dataclass, field
from datetime import date
from typing import Optional
from uuid import UUID


@dataclass
class HireEmployee:
    """استخدام کارمند جدید."""
    tenant_id: UUID
    employee_code: str
    first_name: str
    last_name: str
    national_code: str
    hire_date: date
    employment_type: str = "FULL_TIME"
    org_unit_id: Optional[UUID] = None
    position_id: Optional[UUID] = None
    legal_entity_id: Optional[UUID] = None
    location_id: Optional[UUID] = None
    email: str = ""
    mobile: str = ""
    metadata: dict = field(default_factory=dict)


@dataclass
class TerminateEmployee:
    """خاتمه همکاری کارمند."""
    tenant_id: UUID
    employee_id: UUID
    termination_date: date
    reason: str = ""


@dataclass
class TransferEmployee:
    """انتقال کارمند."""
    tenant_id: UUID
    employee_id: UUID
    new_org_unit_id: UUID
    new_position_id: Optional[UUID] = None
    effective_date: Optional[date] = None
    reason: str = ""


@dataclass
class CreatePosition:
    """ایجاد پست سازمانی."""
    tenant_id: UUID
    code: str
    title: str
    job_title_id: UUID
    org_unit_id: UUID
    reports_to_id: Optional[UUID] = None
    headcount: int = 1


@dataclass
class FillPosition:
    """تخصیص نیرو به پست."""
    tenant_id: UUID
    position_id: UUID
    employee_id: UUID


@dataclass
class RequestLeave:
    """درخواست مرخصی."""
    tenant_id: UUID
    employee_id: UUID
    leave_type: str
    start_date: date
    end_date: date
    reason: str = ""
    substitute_id: Optional[UUID] = None


@dataclass
class ApproveLeave:
    """تأیید مرخصی."""
    tenant_id: UUID
    leave_request_id: UUID
    approved_by: UUID


@dataclass
class SetSalary:
    """تنظیم حقوق."""
    tenant_id: UUID
    employee_id: UUID
    base_salary: float
    effective_date: date
    housing_allowance: float = 0
    transportation_allowance: float = 0
    food_allowance: float = 0
    family_allowance: float = 0
    pay_grade_id: Optional[UUID] = None
    change_reason: str = ""


@dataclass
class RecordAttendance:
    """ثبت حضور."""
    tenant_id: UUID
    employee_id: UUID
    attendance_date: date
    check_in: Optional[str] = None
    check_out: Optional[str] = None
    source: str = "MANUAL"
