from __future__ import annotations

from typing import ClassVar

from django.db import models
from django.utils.translation import gettext_lazy as _

from simorgh.core.models import TenantScopedModel, UUIDModel


class JobFamily(UUIDModel, TenantScopedModel):
    """Groups related job titles (e.g., 'Engineering', 'Sales', 'Finance')."""

    organization_node = models.ForeignKey(
        "organizations.OrganizationNode",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="+",
        verbose_name=_("organization node"),
    )

    code = models.CharField(_("code"), max_length=40)
    name = models.CharField(_("name"), max_length=120)
    description = models.TextField(_("description"), blank=True)

    class Meta(TenantScopedModel.Meta):
        db_table = "hr_job_family"
        verbose_name = _("Job Family")
        verbose_name_plural = _("Job Families")
        constraints: ClassVar[list] = [
            models.UniqueConstraint(
                fields=["tenant", "code"],
                name="hr_jobfamily_unique_tenant_code",
            )
        ]
        ordering = ["name"]

    def __str__(self) -> str:
        return self.name


class JobGrade(UUIDModel, TenantScopedModel):
    """Salary grade / band (e.g., 'G7', 'L5', 'VP1')."""

    organization_node = models.ForeignKey(
        "organizations.OrganizationNode",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="+",
        verbose_name=_("organization node"),
    )

    code = models.CharField(_("code"), max_length=40)
    name = models.CharField(_("name"), max_length=120)
    grade_level = models.PositiveSmallIntegerField(
        _("grade level"),
        help_text=_("Numeric level for comparison. Higher = more senior."),
    )
    min_salary = models.DecimalField(
        _("min salary"),
        max_digits=12,
        decimal_places=2,
        null=True,
        blank=True,
    )
    max_salary = models.DecimalField(
        _("max salary"),
        max_digits=12,
        decimal_places=2,
        null=True,
        blank=True,
    )
    currency = models.CharField(_("currency"), max_length=3, default="USD")
    job_family = models.ForeignKey(
        JobFamily,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="grades",
        verbose_name=_("job family"),
    )

    class Meta(TenantScopedModel.Meta):
        db_table = "hr_job_grade"
        verbose_name = _("Job Grade")
        verbose_name_plural = _("Job Grades")
        constraints: ClassVar[list] = [
            models.UniqueConstraint(
                fields=["tenant", "code"],
                name="hr_jobgrade_unique_tenant_code",
            )
        ]
        ordering = ["grade_level"]

    def __str__(self) -> str:
        return f"{self.code} — {self.name}"
