﻿"""
HRM ORM Models - Infrastructure Layer.

Ù…Ø¯Ù„â€ŒÙ‡Ø§ÛŒ Django ORM Ù…Ø§Ú˜ÙˆÙ„ Ù…Ù†Ø§Ø¨Ø¹ Ø§Ù†Ø³Ø§Ù†ÛŒ.
ØªÙ…Ø§Ù… Ø¬Ø¯Ø§ÙˆÙ„ Ø¨Ø§ Ù¾ÛŒØ´ÙˆÙ†Ø¯ hrm_ Ù‡Ø³ØªÙ†Ø¯.
verbose_nameâ€ŒÙ‡Ø§ Ø¨Ù‡ ÙØ§Ø±Ø³ÛŒ.
"""
import uuid

from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
from apps.core.tenant.models import TenantAwareModel


# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
# 1ï¸âƒ£ Organization Structure Models
# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

class LegalEntityModel(TenantAwareModel):
    """Ù…Ø¯Ù„ ORM - Ø´Ø®ØµÛŒØª Ø­Ù‚ÙˆÙ‚ÛŒ."""

    class EntityType(models.TextChoices):
        COMPANY = "COMPANY", _("Ø´Ø±Ú©Øª")
        BRANCH = "BRANCH", _("Ø´Ø¹Ø¨Ù‡")
        REPRESENTATIVE = "REPRESENTATIVE", _("Ù†Ù…Ø§ÛŒÙ†Ø¯Ú¯ÛŒ")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(_("Ù†Ø§Ù…"), max_length=255)
    name_en = models.CharField(_("Ù†Ø§Ù… Ø§Ù†Ú¯Ù„ÛŒØ³ÛŒ"), max_length=255, blank=True)
    registration_number = models.CharField(
        _("Ø´Ù…Ø§Ø±Ù‡ Ø«Ø¨Øª"), max_length=50, db_index=True
    )
    national_id = models.CharField(
        _("Ø´Ù†Ø§Ø³Ù‡ Ù…Ù„ÛŒ"), max_length=20, db_index=True
    )
    economic_code = models.CharField(
        _("Ú©Ø¯ Ø§Ù‚ØªØµØ§Ø¯ÛŒ"), max_length=20, blank=True
    )
    registration_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø«Ø¨Øª"), null=True, blank=True)
    entity_type = models.CharField(
        _("Ù†ÙˆØ¹"),
        max_length=20,
        choices=EntityType.choices,
        default=EntityType.COMPANY,
    )
    parent_entity = models.ForeignKey(
        "self",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="children",
        verbose_name=_("Ø´Ø®ØµÛŒØª Ø­Ù‚ÙˆÙ‚ÛŒ Ù…Ø§Ø¯Ø±"),
    )
    address = models.TextField(_("Ø¢Ø¯Ø±Ø³"), blank=True)
    phone = models.CharField(_("ØªÙ„ÙÙ†"), max_length=50, blank=True)
    fax = models.CharField(_("ÙÚ©Ø³"), max_length=50, blank=True)
    email = models.EmailField(_("Ø§ÛŒÙ…ÛŒÙ„"), blank=True)
    website = models.URLField(_("ÙˆØ¨Ø³Ø§ÛŒØª"), blank=True)
    postal_code = models.CharField(_("Ú©Ø¯ Ù¾Ø³ØªÛŒ"), max_length=20, blank=True)
    city = models.CharField(_("Ø´Ù‡Ø±"), max_length=100, blank=True)
    province = models.CharField(_("Ø§Ø³ØªØ§Ù†"), max_length=100, blank=True)
    country = models.CharField(
        _("Ú©Ø´ÙˆØ±"), max_length=5, default="IR"
    )
    is_active = models.BooleanField(_("ÙØ¹Ø§Ù„"), default=True, db_index=True)
    metadata = models.JSONField(_("Ù…ØªØ§Ø¯ÛŒØªØ§"), default=dict, blank=True)
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)
    created_by = models.UUIDField(_("Ø§ÛŒØ¬Ø§Ø¯ ØªÙˆØ³Ø·"), null=True, blank=True)
    updated_by = models.UUIDField(_("Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ ØªÙˆØ³Ø·"), null=True, blank=True)

    class Meta:
        app_label = "hrm"
        db_table = "hrm_legal_entity"
        verbose_name = _("Ø´Ø®ØµÛŒØª Ø­Ù‚ÙˆÙ‚ÛŒ")
        verbose_name_plural = _("Ø´Ø®ØµÛŒØªâ€ŒÙ‡Ø§ÛŒ Ø­Ù‚ÙˆÙ‚ÛŒ")
        unique_together = [["tenant", "national_id"]]
        indexes = [
            models.Index(fields=["tenant", "is_active"]),
            models.Index(fields=["tenant", "entity_type"]),
        ]

    def __str__(self):
        return self.name


class LocationModel(TenantAwareModel):
    """Ù…Ø¯Ù„ ORM - Ù…Ú©Ø§Ù† ÙÛŒØ²ÛŒÚ©ÛŒ."""

    class LocationType(models.TextChoices):
        HEADQUARTERS = "HEADQUARTERS", _("Ø¯ÙØªØ± Ù…Ø±Ú©Ø²ÛŒ")
        OFFICE = "OFFICE", _("Ø¯ÙØªØ±")
        FACTORY = "FACTORY", _("Ú©Ø§Ø±Ø®Ø§Ù†Ù‡")
        WAREHOUSE = "WAREHOUSE", _("Ø§Ù†Ø¨Ø§Ø±")
        BRANCH = "BRANCH", _("Ø´Ø¹Ø¨Ù‡")
        REMOTE = "REMOTE", _("Ø¯ÙˆØ±Ú©Ø§Ø±ÛŒ")
        HYBRID = "HYBRID", _("ØªØ±Ú©ÛŒØ¨ÛŒ")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(_("Ù†Ø§Ù…"), max_length=255)
    code = models.CharField(_("Ú©Ø¯"), max_length=50)
    location_type = models.CharField(
        _("Ù†ÙˆØ¹ Ù…Ú©Ø§Ù†"),
        max_length=20,
        choices=LocationType.choices,
        default=LocationType.OFFICE,
    )
    legal_entity = models.ForeignKey(
        LegalEntityModel,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="locations",
        verbose_name=_("Ø´Ø®ØµÛŒØª Ø­Ù‚ÙˆÙ‚ÛŒ"),
    )
    org_unit_id = models.UUIDField(
        _("ÙˆØ§Ø­Ø¯ Ø³Ø§Ø²Ù…Ø§Ù†ÛŒ"), null=True, blank=True
    )
    address = models.TextField(_("Ø¢Ø¯Ø±Ø³"), blank=True)
    city = models.CharField(_("Ø´Ù‡Ø±"), max_length=100, blank=True)
    province = models.CharField(_("Ø§Ø³ØªØ§Ù†"), max_length=100, blank=True)
    country = models.CharField(_("Ú©Ø´ÙˆØ±"), max_length=5, default="IR")
    postal_code = models.CharField(_("Ú©Ø¯ Ù¾Ø³ØªÛŒ"), max_length=20, blank=True)
    phone = models.CharField(_("ØªÙ„ÙÙ†"), max_length=50, blank=True)
    latitude = models.FloatField(_("Ø¹Ø±Ø¶ Ø¬ØºØ±Ø§ÙÛŒØ§ÛŒÛŒ"), null=True, blank=True)
    longitude = models.FloatField(_("Ø·ÙˆÙ„ Ø¬ØºØ±Ø§ÙÛŒØ§ÛŒÛŒ"), null=True, blank=True)
    capacity = models.PositiveIntegerField(_("Ø¸Ø±ÙÛŒØª"), default=0)
    timezone = models.CharField(
        _("Ù…Ù†Ø·Ù‚Ù‡ Ø²Ù…Ø§Ù†ÛŒ"), max_length=50, default="Asia/Tehran"
    )
    is_active = models.BooleanField(_("ÙØ¹Ø§Ù„"), default=True, db_index=True)
    metadata = models.JSONField(_("Ù…ØªØ§Ø¯ÛŒØªØ§"), default=dict, blank=True)
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)

    class Meta:
        app_label = "hrm"
        db_table = "hrm_location"
        verbose_name = _("Ù…Ú©Ø§Ù†")
        verbose_name_plural = _("Ù…Ú©Ø§Ù†â€ŒÙ‡Ø§")
        unique_together = [["tenant", "code"]]
        indexes = [
            models.Index(fields=["tenant", "location_type"]),
            models.Index(fields=["tenant", "is_active"]),
        ]

    def __str__(self):
        return f"{self.name} ({self.code})"


# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
# 2ï¸âƒ£ Employee Master Data Models
# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

class EmployeeModel(TenantAwareModel):
    """Ù…Ø¯Ù„ ORM - Ú©Ø§Ø±Ù…Ù†Ø¯."""

    class EmploymentStatus(models.TextChoices):
        ACTIVE = "ACTIVE", _("ÙØ¹Ø§Ù„")
        ON_LEAVE = "ON_LEAVE", _("Ø¯Ø± Ù…Ø±Ø®ØµÛŒ")
        SUSPENDED = "SUSPENDED", _("ØªØ¹Ù„ÛŒÙ‚")
        TERMINATED = "TERMINATED", _("Ø®Ø§ØªÙ…Ù‡â€ŒÛŒØ§ÙØªÙ‡")
        RETIRED = "RETIRED", _("Ø¨Ø§Ø²Ù†Ø´Ø³ØªÙ‡")
        PROBATION = "PROBATION", _("Ø¢Ø²Ù…Ø§ÛŒØ´ÛŒ")

    class EmploymentType(models.TextChoices):
        FULL_TIME = "FULL_TIME", _("ØªÙ…Ø§Ù…â€ŒÙˆÙ‚Øª")
        PART_TIME = "PART_TIME", _("Ù¾Ø§Ø±Ù‡â€ŒÙˆÙ‚Øª")
        CONTRACT = "CONTRACT", _("Ù‚Ø±Ø§Ø±Ø¯Ø§Ø¯ÛŒ")
        INTERN = "INTERN", _("Ú©Ø§Ø±Ø¢Ù…ÙˆØ²")

    class GenderChoices(models.TextChoices):
        MALE = "MALE", _("Ù…Ø±Ø¯")
        FEMALE = "FEMALE", _("Ø²Ù†")

    class MaritalChoices(models.TextChoices):
        SINGLE = "SINGLE", _("Ù…Ø¬Ø±Ø¯")
        MARRIED = "MARRIED", _("Ù…ØªØ£Ù‡Ù„")
        DIVORCED = "DIVORCED", _("Ù…Ø·Ù„Ù‚Ù‡")
        WIDOWED = "WIDOWED", _("Ø¨ÛŒÙˆÙ‡")

    class MilitaryChoices(models.TextChoices):
        COMPLETED = "COMPLETED", _("Ù¾Ø§ÛŒØ§Ù† Ø®Ø¯Ù…Øª")
        EXEMPT = "EXEMPT", _("Ù…Ø¹Ø§Ù")
        EDUCATIONAL_EXEMPT = "EDUCATIONAL_EXEMPT", _("Ù…Ø¹Ø§Ù ØªØ­ØµÛŒÙ„ÛŒ")
        ACTIVE = "ACTIVE", _("Ø¯Ø± Ø­Ø§Ù„ Ø®Ø¯Ù…Øª")
        NOT_APPLICABLE = "NOT_APPLICABLE", _("Ø´Ø§Ù…Ù„ Ù†Ù…ÛŒâ€ŒØ´ÙˆØ¯")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    # Ø§Ø·Ù„Ø§Ø¹Ø§Øª Ø´Ø®ØµÛŒ
    employee_code = models.CharField(
        _("Ú©Ø¯ Ù¾Ø±Ø³Ù†Ù„ÛŒ"), max_length=50, db_index=True
    )
    first_name = models.CharField(_("Ù†Ø§Ù…"), max_length=100)
    last_name = models.CharField(_("Ù†Ø§Ù… Ø®Ø§Ù†ÙˆØ§Ø¯Ú¯ÛŒ"), max_length=100)
    first_name_en = models.CharField(
        _("Ù†Ø§Ù… Ø§Ù†Ú¯Ù„ÛŒØ³ÛŒ"), max_length=100, blank=True
    )
    last_name_en = models.CharField(
        _("Ù†Ø§Ù… Ø®Ø§Ù†ÙˆØ§Ø¯Ú¯ÛŒ Ø§Ù†Ú¯Ù„ÛŒØ³ÛŒ"), max_length=100, blank=True
    )
    national_code = models.CharField(
        _("Ú©Ø¯ Ù…Ù„ÛŒ"), max_length=10, db_index=True
    )
    birth_certificate_number = models.CharField(
        _("Ø´Ù…Ø§Ø±Ù‡ Ø´Ù†Ø§Ø³Ù†Ø§Ù…Ù‡"), max_length=20, blank=True
    )
    date_of_birth = models.DateField(_("ØªØ§Ø±ÛŒØ® ØªÙˆÙ„Ø¯"), null=True, blank=True)
    gender = models.CharField(
        _("Ø¬Ù†Ø³ÛŒØª"),
        max_length=10,
        choices=GenderChoices.choices,
        default=GenderChoices.MALE,
    )
    marital_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª ØªØ£Ù‡Ù„"),
        max_length=15,
        choices=MaritalChoices.choices,
        default=MaritalChoices.SINGLE,
    )
    military_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª Ù†Ø¸Ø§Ù… ÙˆØ¸ÛŒÙÙ‡"),
        max_length=25,
        choices=MilitaryChoices.choices,
        default=MilitaryChoices.NOT_APPLICABLE,
    )
    nationality = models.CharField(
        _("Ù…Ù„ÛŒØª"), max_length=5, default="IR"
    )

    # Ø§Ø·Ù„Ø§Ø¹Ø§Øª ØªÙ…Ø§Ø³
    phone = models.CharField(_("ØªÙ„ÙÙ†"), max_length=20, blank=True)
    mobile = models.CharField(_("Ù…ÙˆØ¨Ø§ÛŒÙ„"), max_length=20, blank=True)
    email = models.EmailField(_("Ø§ÛŒÙ…ÛŒÙ„"), blank=True)
    address = models.TextField(_("Ø¢Ø¯Ø±Ø³"), blank=True)
    postal_code = models.CharField(_("Ú©Ø¯ Ù¾Ø³ØªÛŒ"), max_length=20, blank=True)
    city = models.CharField(_("Ø´Ù‡Ø±"), max_length=100, blank=True)
    province = models.CharField(_("Ø§Ø³ØªØ§Ù†"), max_length=100, blank=True)

    # ØªÙ…Ø§Ø³ Ø§Ø¶Ø·Ø±Ø§Ø±ÛŒ
    emergency_contact_name = models.CharField(
        _("Ù†Ø§Ù… ØªÙ…Ø§Ø³ Ø§Ø¶Ø·Ø±Ø§Ø±ÛŒ"), max_length=200, blank=True
    )
    emergency_contact_phone = models.CharField(
        _("ØªÙ„ÙÙ† ØªÙ…Ø§Ø³ Ø§Ø¶Ø·Ø±Ø§Ø±ÛŒ"), max_length=20, blank=True
    )
    emergency_contact_relation = models.CharField(
        _("Ù†Ø³Ø¨Øª ØªÙ…Ø§Ø³ Ø§Ø¶Ø·Ø±Ø§Ø±ÛŒ"), max_length=50, blank=True
    )

    # Ø§Ø·Ù„Ø§Ø¹Ø§Øª Ø§Ø³ØªØ®Ø¯Ø§Ù…ÛŒ
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="hrm_employee",
        verbose_name=_("Ø­Ø³Ø§Ø¨ Ú©Ø§Ø±Ø¨Ø±ÛŒ"),
    )
    hire_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø§Ø³ØªØ®Ø¯Ø§Ù…"), null=True, blank=True)
    termination_date = models.DateField(
        _("ØªØ§Ø±ÛŒØ® Ø®Ø§ØªÙ…Ù‡"), null=True, blank=True
    )
    employment_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª Ø§Ø³ØªØ®Ø¯Ø§Ù…"),
        max_length=15,
        choices=EmploymentStatus.choices,
        default=EmploymentStatus.PROBATION,
        db_index=True,
    )
    employment_type = models.CharField(
        _("Ù†ÙˆØ¹ Ø§Ø³ØªØ®Ø¯Ø§Ù…"),
        max_length=15,
        choices=EmploymentType.choices,
        default=EmploymentType.FULL_TIME,
    )
    probation_end_date = models.DateField(
        _("Ù¾Ø§ÛŒØ§Ù† Ø¯ÙˆØ±Ù‡ Ø¢Ø²Ù…Ø§ÛŒØ´ÛŒ"), null=True, blank=True
    )

    # Ø§Ø±ØªØ¨Ø§Ø·Ø§Øª Ø³Ø§Ø²Ù…Ø§Ù†ÛŒ
    legal_entity = models.ForeignKey(
        LegalEntityModel,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="employees",
        verbose_name=_("Ø´Ø®ØµÛŒØª Ø­Ù‚ÙˆÙ‚ÛŒ"),
    )
    org_unit_id = models.UUIDField(
        _("ÙˆØ§Ø­Ø¯ Ø³Ø§Ø²Ù…Ø§Ù†ÛŒ"), null=True, blank=True, db_index=True
    )
    location = models.ForeignKey(
        LocationModel,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="employees",
        verbose_name=_("Ù…Ú©Ø§Ù†"),
    )
    primary_position = models.ForeignKey(
        "PositionModel",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="incumbent_employees",
        verbose_name=_("Ù¾Ø³Øª Ø³Ø§Ø²Ù…Ø§Ù†ÛŒ"),
    )
    manager = models.ForeignKey(
        "self",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="direct_reports",
        verbose_name=_("Ù…Ø¯ÛŒØ± Ù…Ø³ØªÙ‚ÛŒÙ…"),
    )

    # Ø³ÛŒØ³ØªÙ…
    is_active = models.BooleanField(_("ÙØ¹Ø§Ù„"), default=True, db_index=True)
    metadata = models.JSONField(_("Ù…ØªØ§Ø¯ÛŒØªØ§"), default=dict, blank=True)
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)
    created_by = models.UUIDField(_("Ø§ÛŒØ¬Ø§Ø¯ ØªÙˆØ³Ø·"), null=True, blank=True)
    updated_by = models.UUIDField(_("Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ ØªÙˆØ³Ø·"), null=True, blank=True)

    class Meta:
        app_label = "hrm"
        db_table = "hrm_employee"
        verbose_name = _("Ú©Ø§Ø±Ù…Ù†Ø¯")
        verbose_name_plural = _("Ú©Ø§Ø±Ù…Ù†Ø¯Ø§Ù†")
        unique_together = [
            ["tenant", "employee_code"],
            ["tenant", "national_code"],
        ]
        indexes = [
            models.Index(fields=["tenant", "employment_status"]),
            models.Index(fields=["tenant", "is_active"]),
            models.Index(fields=["tenant", "org_unit_id"]),
            models.Index(fields=["tenant", "legal_entity"]),
            models.Index(
                fields=["tenant", "last_name", "first_name"],
                name="hrm_emp_name_idx",
            ),
        ]

    def __str__(self):
        return f"{self.first_name} {self.last_name} ({self.employee_code})"

    @property
    def full_name(self):
        return f"{self.first_name} {self.last_name}".strip()


class EmploymentRecordModel(TenantAwareModel):
    """Ù…Ø¯Ù„ ORM - Ø³Ø§Ø¨Ù‚Ù‡ Ø§Ø³ØªØ®Ø¯Ø§Ù…ÛŒ."""

    class ContractType(models.TextChoices):
        PERMANENT = "PERMANENT", _("Ø¯Ø§Ø¦Ù…")
        TEMPORARY = "TEMPORARY", _("Ù…ÙˆÙ‚Øª")
        FIXED_TERM = "FIXED_TERM", _("Ù…Ø¯Øª Ù…Ø¹ÛŒÙ†")
        PROJECT_BASED = "PROJECT_BASED", _("Ù¾Ø±ÙˆÚ˜Ù‡â€ŒØ§ÛŒ")
        INTERNSHIP = "INTERNSHIP", _("Ú©Ø§Ø±Ø¢Ù…ÙˆØ²ÛŒ")
        CONSULTANCY = "CONSULTANCY", _("Ù…Ø´Ø§ÙˆØ±Ù‡â€ŒØ§ÛŒ")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    employee = models.ForeignKey(
        EmployeeModel,
        on_delete=models.CASCADE,
        related_name="employment_records",
        verbose_name=_("Ú©Ø§Ø±Ù…Ù†Ø¯"),
    )
    contract_type = models.CharField(
        _("Ù†ÙˆØ¹ Ù‚Ø±Ø§Ø±Ø¯Ø§Ø¯"),
        max_length=20,
        choices=ContractType.choices,
        default=ContractType.PERMANENT,
    )
    contract_number = models.CharField(
        _("Ø´Ù…Ø§Ø±Ù‡ Ù‚Ø±Ø§Ø±Ø¯Ø§Ø¯"), max_length=50, blank=True
    )
    start_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø´Ø±ÙˆØ¹"))
    end_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ù¾Ø§ÛŒØ§Ù†"), null=True, blank=True)
    title = models.CharField(_("Ø¹Ù†ÙˆØ§Ù†"), max_length=255, blank=True)
    org_unit_id = models.UUIDField(
        _("ÙˆØ§Ø­Ø¯ Ø³Ø§Ø²Ù…Ø§Ù†ÛŒ"), null=True, blank=True
    )
    position = models.ForeignKey(
        "PositionModel",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_("Ù¾Ø³Øª"),
    )
    legal_entity = models.ForeignKey(
        LegalEntityModel,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_("Ø´Ø®ØµÛŒØª Ø­Ù‚ÙˆÙ‚ÛŒ"),
    )
    is_current = models.BooleanField(_("ÙØ¹Ù„ÛŒ"), default=True, db_index=True)
    termination_reason = models.TextField(_("Ø¯Ù„ÛŒÙ„ Ø®Ø§ØªÙ…Ù‡"), blank=True)
    notes = models.TextField(_("ÛŒØ§Ø¯Ø¯Ø§Ø´Øª"), blank=True)
    metadata = models.JSONField(_("Ù…ØªØ§Ø¯ÛŒØªØ§"), default=dict, blank=True)
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)

    class Meta:
        app_label = "hrm"
        db_table = "hrm_employment_record"
        verbose_name = _("Ø³Ø§Ø¨Ù‚Ù‡ Ø§Ø³ØªØ®Ø¯Ø§Ù…ÛŒ")
        verbose_name_plural = _("Ø³ÙˆØ§Ø¨Ù‚ Ø§Ø³ØªØ®Ø¯Ø§Ù…ÛŒ")
        ordering = ["-start_date"]
        indexes = [
            models.Index(fields=["tenant", "employee", "is_current"]),
        ]

    def __str__(self):
        return f"{self.employee} - {self.contract_type} ({self.start_date})"


class EmployeeDocumentModel(TenantAwareModel):
    """Ù…Ø¯Ù„ ORM - Ù…Ø¯Ø§Ø±Ú© Ú©Ø§Ø±Ù…Ù†Ø¯."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    employee = models.ForeignKey(
        EmployeeModel,
        on_delete=models.CASCADE,
        related_name="documents",
        verbose_name=_("Ú©Ø§Ø±Ù…Ù†Ø¯"),
    )
    document_type = models.CharField(_("Ù†ÙˆØ¹ Ù…Ø¯Ø±Ú©"), max_length=50)
    title = models.CharField(_("Ø¹Ù†ÙˆØ§Ù†"), max_length=255)
    document_number = models.CharField(
        _("Ø´Ù…Ø§Ø±Ù‡ Ù…Ø¯Ø±Ú©"), max_length=100, blank=True
    )
    issue_date = models.DateField(_("ØªØ§Ø±ÛŒØ® ØµØ¯ÙˆØ±"), null=True, blank=True)
    expiry_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø§Ù†Ù‚Ø¶Ø§"), null=True, blank=True)
    file_path = models.FileField(
        _("ÙØ§ÛŒÙ„"), upload_to="hrm/documents/", blank=True
    )
    file_size = models.PositiveIntegerField(_("Ø­Ø¬Ù… ÙØ§ÛŒÙ„"), default=0)
    mime_type = models.CharField(_("Ù†ÙˆØ¹ ÙØ§ÛŒÙ„"), max_length=100, blank=True)
    is_verified = models.BooleanField(_("ØªØ£ÛŒÛŒØ¯ Ø´Ø¯Ù‡"), default=False)
    verified_by = models.UUIDField(_("ØªØ£ÛŒÛŒØ¯ ØªÙˆØ³Ø·"), null=True, blank=True)
    notes = models.TextField(_("ÛŒØ§Ø¯Ø¯Ø§Ø´Øª"), blank=True)
    metadata = models.JSONField(_("Ù…ØªØ§Ø¯ÛŒØªØ§"), default=dict, blank=True)
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)

    class Meta:
        app_label = "hrm"
        db_table = "hrm_employee_document"
        verbose_name = _("Ù…Ø¯Ø±Ú© Ú©Ø§Ø±Ù…Ù†Ø¯")
        verbose_name_plural = _("Ù…Ø¯Ø§Ø±Ú© Ú©Ø§Ø±Ù…Ù†Ø¯Ø§Ù†")
        indexes = [
            models.Index(fields=["tenant", "employee", "document_type"]),
            models.Index(fields=["tenant", "expiry_date"]),
        ]

    def __str__(self):
        return f"{self.employee} - {self.title}"


# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
# 3ï¸âƒ£ Position & Job Models
# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•

class JobFamilyModel(TenantAwareModel):
    """Ù…Ø¯Ù„ ORM - Ø®Ø§Ù†ÙˆØ§Ø¯Ù‡ Ø´ØºÙ„ÛŒ."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(_("Ù†Ø§Ù…"), max_length=255)
    code = models.CharField(_("Ú©Ø¯"), max_length=50)
    description = models.TextField(_("Ø´Ø±Ø­"), blank=True)
    is_active = models.BooleanField(_("ÙØ¹Ø§Ù„"), default=True)
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)

    class Meta:
        app_label = "hrm"
        db_table = "hrm_job_family"
        verbose_name = _("Ø®Ø§Ù†ÙˆØ§Ø¯Ù‡ Ø´ØºÙ„ÛŒ")
        verbose_name_plural = _("Ø®Ø§Ù†ÙˆØ§Ø¯Ù‡â€ŒÙ‡Ø§ÛŒ Ø´ØºÙ„ÛŒ")
        unique_together = [["tenant", "code"]]

    def __str__(self):
        return self.name


class JobTitleModel(TenantAwareModel):
    """Ù…Ø¯Ù„ ORM - Ø¹Ù†ÙˆØ§Ù† Ø´ØºÙ„ÛŒ."""

    class JobLevel(models.TextChoices):
        INTERN = "INTERN", _("Ú©Ø§Ø±Ø¢Ù…ÙˆØ²")
        JUNIOR = "JUNIOR", _("Ú©Ø§Ø±Ø´Ù†Ø§Ø³ Ù…Ø¨ØªØ¯ÛŒ")
        MID = "MID", _("Ú©Ø§Ø±Ø´Ù†Ø§Ø³")
        SENIOR = "SENIOR", _("Ú©Ø§Ø±Ø´Ù†Ø§Ø³ Ø§Ø±Ø´Ø¯")
        LEAD = "LEAD", _("Ø³Ø±Ù¾Ø±Ø³Øª")
        MANAGER = "MANAGER", _("Ù…Ø¯ÛŒØ±")
        DIRECTOR = "DIRECTOR", _("Ù…Ø¯ÛŒØ±Ú©Ù„")
        VP = "VP", _("Ù…Ø¹Ø§ÙˆÙ†")
        C_LEVEL = "C_LEVEL", _("Ù…Ø¯ÛŒØ± Ø¹Ø§Ù…Ù„")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(_("Ø¹Ù†ÙˆØ§Ù†"), max_length=255)
    title_en = models.CharField(_("Ø¹Ù†ÙˆØ§Ù† Ø§Ù†Ú¯Ù„ÛŒØ³ÛŒ"), max_length=255, blank=True)
    code = models.CharField(_("Ú©Ø¯"), max_length=50)
    job_family = models.ForeignKey(
        JobFamilyModel,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="job_titles",
        verbose_name=_("Ø®Ø§Ù†ÙˆØ§Ø¯Ù‡ Ø´ØºÙ„ÛŒ"),
    )
    level = models.CharField(
        _("Ø³Ø·Ø­"),
        max_length=15,
        choices=JobLevel.choices,
        default=JobLevel.MID,
    )
    grade = models.PositiveIntegerField(_("Ø±ØªØ¨Ù‡"), default=0)
    description = models.TextField(_("Ø´Ø±Ø­ Ø´ØºÙ„"), blank=True)
    responsibilities = models.TextField(_("Ù…Ø³Ø¦ÙˆÙ„ÛŒØªâ€ŒÙ‡Ø§"), blank=True)
    qualifications = models.TextField(_("Ø´Ø±Ø§ÛŒØ· Ø§Ø­Ø±Ø§Ø²"), blank=True)
    min_experience_years = models.PositiveIntegerField(
        _("Ø­Ø¯Ø§Ù‚Ù„ Ø³Ø§Ø¨Ù‚Ù‡ (Ø³Ø§Ù„)"), default=0
    )
    is_active = models.BooleanField(_("ÙØ¹Ø§Ù„"), default=True)
    metadata = models.JSONField(_("Ù…ØªØ§Ø¯ÛŒØªØ§"), default=dict, blank=True)
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)

    class Meta:
        app_label = "hrm"
        db_table = "hrm_job_title"
        verbose_name = _("Ø¹Ù†ÙˆØ§Ù† Ø´ØºÙ„ÛŒ")
        verbose_name_plural = _("Ø¹Ù†Ø§ÙˆÛŒÙ† Ø´ØºÙ„ÛŒ")
        unique_together = [["tenant", "code"]]
        indexes = [
            models.Index(fields=["tenant", "level"]),
            models.Index(fields=["tenant", "job_family"]),
        ]

    def __str__(self):
        return f"{self.title} ({self.code})"


class PositionModel(TenantAwareModel):
    """Ù…Ø¯Ù„ ORM - Ù¾Ø³Øª Ø³Ø§Ø²Ù…Ø§Ù†ÛŒ."""

    class PositionStatus(models.TextChoices):
        ACTIVE = "ACTIVE", _("ÙØ¹Ø§Ù„")
        FROZEN = "FROZEN", _("Ù…Ù†Ø¬Ù…Ø¯")
        ABOLISHED = "ABOLISHED", _("Ø­Ø°Ù Ø´Ø¯Ù‡")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(_("Ø¹Ù†ÙˆØ§Ù†"), max_length=255)
    code = models.CharField(_("Ú©Ø¯"), max_length=50)
    job_title = models.ForeignKey(
        JobTitleModel,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="positions",
        verbose_name=_("Ø¹Ù†ÙˆØ§Ù† Ø´ØºÙ„ÛŒ"),
    )
    org_unit_id = models.UUIDField(
        _("ÙˆØ§Ø­Ø¯ Ø³Ø§Ø²Ù…Ø§Ù†ÛŒ"), null=True, blank=True, db_index=True
    )
    legal_entity = models.ForeignKey(
        LegalEntityModel,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="positions",
        verbose_name=_("Ø´Ø®ØµÛŒØª Ø­Ù‚ÙˆÙ‚ÛŒ"),
    )
    location = models.ForeignKey(
        LocationModel,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="positions",
        verbose_name=_("Ù…Ú©Ø§Ù†"),
    )
    reports_to = models.ForeignKey(
        "self",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="subordinate_positions",
        verbose_name=_("Ú¯Ø²Ø§Ø±Ø´â€ŒØ¯Ù‡ÛŒ Ø¨Ù‡"),
    )
    functional_reports_to = models.ForeignKey(
        "self",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="functional_subordinates",
        verbose_name=_("Ú¯Ø²Ø§Ø±Ø´â€ŒØ¯Ù‡ÛŒ Ø¹Ù…Ù„ÛŒØ§ØªÛŒ Ø¨Ù‡"),
    )
    incumbent = models.ForeignKey(
        EmployeeModel,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="held_positions",
        verbose_name=_("Ø´Ø§ØºÙ„ ÙØ¹Ù„ÛŒ"),
    )
    status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª"),
        max_length=15,
        choices=PositionStatus.choices,
        default=PositionStatus.ACTIVE,
        db_index=True,
    )
    is_key_position = models.BooleanField(
        _("Ù¾Ø³Øª Ú©Ù„ÛŒØ¯ÛŒ"), default=False, db_index=True
    )
    is_budgeted = models.BooleanField(_("Ø¨ÙˆØ¯Ø¬Ù‡â€ŒØ§ÛŒ"), default=True)
    budget_amount = models.DecimalField(
        _("Ù…Ø¨Ù„Øº Ø¨ÙˆØ¯Ø¬Ù‡"),
        max_digits=18,
        decimal_places=0,
        default=0,
    )
    headcount = models.PositiveIntegerField(_("ØªØ¹Ø¯Ø§Ø¯ Ù†ÛŒØ±Ùˆ"), default=1)
    fte = models.DecimalField(
        _("FTE"), max_digits=3, decimal_places=2, default=1.00
    )
    effective_date = models.DateField(
        _("ØªØ§Ø±ÛŒØ® Ù…Ø¤Ø«Ø±"), null=True, blank=True
    )
    end_date = models.DateField(
        _("ØªØ§Ø±ÛŒØ® Ù¾Ø§ÛŒØ§Ù†"), null=True, blank=True
    )
    metadata = models.JSONField(_("Ù…ØªØ§Ø¯ÛŒØªØ§"), default=dict, blank=True)
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)

    class Meta:
        app_label = "hrm"
        db_table = "hrm_position"
        verbose_name = _("Ù¾Ø³Øª Ø³Ø§Ø²Ù…Ø§Ù†ÛŒ")
        verbose_name_plural = _("Ù¾Ø³Øªâ€ŒÙ‡Ø§ÛŒ Ø³Ø§Ø²Ù…Ø§Ù†ÛŒ")
        unique_together = [["tenant", "code"]]
        indexes = [
            models.Index(fields=["tenant", "status"]),
            models.Index(fields=["tenant", "org_unit_id"]),
            models.Index(fields=["tenant", "is_key_position"]),
        ]

    def __str__(self):
        return f"{self.title} ({self.code})"

    @property
    def is_vacant(self):
        return self.incumbent is None


class ReportingLineModel(TenantAwareModel):
    """Ù…Ø¯Ù„ ORM - Ø®Ø· Ú¯Ø²Ø§Ø±Ø´â€ŒØ¯Ù‡ÛŒ."""

    class ReportingType(models.TextChoices):
        DIRECT = "DIRECT", _("Ù…Ø³ØªÙ‚ÛŒÙ…")
        FUNCTIONAL = "FUNCTIONAL", _("Ø¹Ù…Ù„ÛŒØ§ØªÛŒ")
        MATRIX = "MATRIX", _("Ù…Ø§ØªØ±ÛŒØ³ÛŒ")
        DOTTED = "DOTTED", _("Ù†Ù‚Ø·Ù‡â€ŒÚ†ÛŒÙ†")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    employee = models.ForeignKey(
        EmployeeModel,
        on_delete=models.CASCADE,
        related_name="reporting_lines",
        verbose_name=_("Ú©Ø§Ø±Ù…Ù†Ø¯"),
    )
    manager = models.ForeignKey(
        EmployeeModel,
        on_delete=models.CASCADE,
        related_name="managed_reports",
        verbose_name=_("Ù…Ø¯ÛŒØ±"),
    )
    reporting_type = models.CharField(
        _("Ù†ÙˆØ¹ Ú¯Ø²Ø§Ø±Ø´â€ŒØ¯Ù‡ÛŒ"),
        max_length=15,
        choices=ReportingType.choices,
        default=ReportingType.DIRECT,
    )
    is_primary = models.BooleanField(_("Ø§ØµÙ„ÛŒ"), default=True)
    effective_date = models.DateField(
        _("ØªØ§Ø±ÛŒØ® Ù…Ø¤Ø«Ø±"), null=True, blank=True
    )
    end_date = models.DateField(
        _("ØªØ§Ø±ÛŒØ® Ù¾Ø§ÛŒØ§Ù†"), null=True, blank=True
    )
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)

    class Meta:
        app_label = "hrm"
        db_table = "hrm_reporting_line"
        verbose_name = _("Ø®Ø· Ú¯Ø²Ø§Ø±Ø´â€ŒØ¯Ù‡ÛŒ")
        verbose_name_plural = _("Ø®Ø·ÙˆØ· Ú¯Ø²Ø§Ø±Ø´â€ŒØ¯Ù‡ÛŒ")
        indexes = [
            models.Index(fields=["tenant", "employee"]),
            models.Index(fields=["tenant", "manager"]),
        ]

    def __str__(self):
        return f"{self.employee} â†’ {self.manager} ({self.reporting_type})"
