"""
HRM Domain Events.

رویدادهای دامنه ماژول منابع انسانی.
Event naming: hrm.{entity}.{action}
"""
from dataclasses import dataclass, field
from datetime import datetime
from decimal import Decimal
from typing import Optional
from uuid import UUID, uuid4

from backend.apps.core.event_bus.events import DomainEvent


# ─────────────────────────────────────────────
# Organization Structure Events
# ─────────────────────────────────────────────

@dataclass
class LegalEntityCreated(DomainEvent):
    """hrm.legal_entity.created"""
    entity_id: UUID = None
    name: str = ""
    national_id: str = ""
    registration_number: str = ""


@dataclass
class LegalEntityUpdated(DomainEvent):
    """hrm.legal_entity.updated"""
    entity_id: UUID = None
    changes: dict = field(default_factory=dict)


@dataclass
class LocationCreated(DomainEvent):
    """hrm.location.created"""
    location_id: UUID = None
    name: str = ""
    code: str = ""
    location_type: str = ""
    legal_entity_id: Optional[UUID] = None


@dataclass
class LocationUpdated(DomainEvent):
    """hrm.location.updated"""
    location_id: UUID = None
    changes: dict = field(default_factory=dict)


# ─────────────────────────────────────────────
# Employee Events
# ─────────────────────────────────────────────

@dataclass
class EmployeeHired(DomainEvent):
    """hrm.employee.hired"""
    employee_id: UUID = None
    employee_code: str = ""
    full_name: str = ""
    hire_date: str = ""
    org_unit_id: Optional[UUID] = None
    position_id: Optional[UUID] = None
    legal_entity_id: Optional[UUID] = None


@dataclass
class EmployeeUpdated(DomainEvent):
    """hrm.employee.updated"""
    employee_id: UUID = None
    changes: dict = field(default_factory=dict)


@dataclass
class EmployeeTerminated(DomainEvent):
    """hrm.employee.terminated"""
    employee_id: UUID = None
    employee_code: str = ""
    termination_date: str = ""
    reason: str = ""


@dataclass
class EmployeeTransferred(DomainEvent):
    """hrm.employee.transferred"""
    employee_id: UUID = None
    from_org_unit_id: Optional[UUID] = None
    to_org_unit_id: UUID = None
    from_position_id: Optional[UUID] = None
    to_position_id: Optional[UUID] = None
    effective_date: str = ""


# ─────────────────────────────────────────────
# Assignment Events
# ─────────────────────────────────────────────

@dataclass
class AssignmentCreated(DomainEvent):
    """hrm.assignment.created"""
    employee_id: UUID = None
    position_id: UUID = None
    org_unit_id: Optional[UUID] = None


@dataclass
class AssignmentEnded(DomainEvent):
    """hrm.assignment.ended"""
    employee_id: UUID = None
    position_id: UUID = None
    end_date: str = ""


# ─────────────────────────────────────────────
# Position Events
# ─────────────────────────────────────────────

@dataclass
class PositionCreated(DomainEvent):
    """hrm.position.created"""
    position_id: UUID = None
    code: str = ""
    title: str = ""
    org_unit_id: Optional[UUID] = None


@dataclass
class PositionVacated(DomainEvent):
    """hrm.position.vacated"""
    position_id: UUID = None
    code: str = ""
    previous_incumbent_id: Optional[UUID] = None


@dataclass
class PositionFilled(DomainEvent):
    """hrm.position.filled"""
    position_id: UUID = None
    code: str = ""
    employee_id: UUID = None


# ─────────────────────────────────────────────
# Job Events
# ─────────────────────────────────────────────

@dataclass
class JobCreated(DomainEvent):
    """hrm.job.created"""
    job_title_id: UUID = None
    code: str = ""
    title: str = ""


@dataclass
class JobUpdated(DomainEvent):
    """hrm.job.updated"""
    job_title_id: UUID = None
    changes: dict = field(default_factory=dict)


# ─────────────────────────────────────────────
# Time & Attendance Events
# ─────────────────────────────────────────────

@dataclass
class TimesheetSubmitted(DomainEvent):
    """hrm.timesheet.submitted"""
    timesheet_id: UUID = None
    employee_id: UUID = None
    period_start: str = ""
    period_end: str = ""
    total_hours: str = ""


@dataclass
class TimesheetApproved(DomainEvent):
    """hrm.timesheet.approved"""
    timesheet_id: UUID = None
    employee_id: UUID = None
    approved_by: UUID = None


@dataclass
class AttendanceRecorded(DomainEvent):
    """hrm.attendance.recorded"""
    employee_id: UUID = None
    attendance_date: str = ""
    status: str = ""
    check_in: str = ""
    check_out: str = ""


# ─────────────────────────────────────────────
# Leave Events
# ─────────────────────────────────────────────

@dataclass
class LeaveRequested(DomainEvent):
    """hrm.leave.requested"""
    request_id: UUID = None
    employee_id: UUID = None
    leave_type: str = ""
    start_date: str = ""
    end_date: str = ""
    days_count: str = ""


@dataclass
class LeaveApproved(DomainEvent):
    """hrm.leave.approved"""
    request_id: UUID = None
    employee_id: UUID = None
    leave_type: str = ""
    approved_by: UUID = None


@dataclass
class LeaveRejected(DomainEvent):
    """hrm.leave.rejected"""
    request_id: UUID = None
    employee_id: UUID = None
    reason: str = ""


@dataclass
class LeaveCancelled(DomainEvent):
    """hrm.leave.cancelled"""
    request_id: UUID = None
    employee_id: UUID = None


# ─────────────────────────────────────────────
# Payroll Events
# ─────────────────────────────────────────────

@dataclass
class SalaryChanged(DomainEvent):
    """hrm.payroll.salary_changed"""
    employee_id: UUID = None
    old_base_salary: str = ""
    new_base_salary: str = ""
    effective_date: str = ""
    reason: str = ""


@dataclass
class CostAllocated(DomainEvent):
    """hrm.payroll.cost_allocated"""
    employee_id: UUID = None
    allocation_type: str = ""
    target_id: UUID = None
    percentage: str = ""
