"""The one master industry/sub-industry taxonomy shared by every part of PezaJob:
professional profiles, company profiles, and (through them) job adverts and search.

Only platform admins manage this list (via Django admin). Ordinary users pick from
it; they never create new industries themselves, only "Other" when nothing fits.
"""
from django.db import models
from django.utils.text import slugify


class Industry(models.Model):
    name = models.CharField(max_length=120, unique=True)
    slug = models.SlugField(max_length=140, unique=True, blank=True)
    description = models.CharField(max_length=255, blank=True)
    sort_order = models.PositiveSmallIntegerField(default=0)
    is_active = models.BooleanField(default=True)

    class Meta:
        ordering = ['sort_order', 'name']
        verbose_name_plural = 'industries'

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        super().save(*args, **kwargs)


class SubIndustry(models.Model):
    industry = models.ForeignKey(Industry, on_delete=models.CASCADE, related_name='sub_industries')
    name = models.CharField(max_length=150)
    slug = models.SlugField(max_length=170, blank=True)
    description = models.CharField(max_length=255, blank=True)
    sort_order = models.PositiveSmallIntegerField(default=0)
    is_active = models.BooleanField(default=True)

    class Meta:
        ordering = ['sort_order', 'name']
        verbose_name_plural = 'sub-industries'
        constraints = [
            models.UniqueConstraint(fields=['industry', 'name'], name='unique_subindustry_per_industry'),
        ]

    def __str__(self):
        return f'{self.industry.name} \u2192 {self.name}'

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(f'{self.industry_id or ""}-{self.name}')
        super().save(*args, **kwargs)


class IndustryAlias(models.Model):
    """Alternative names/search terms that resolve to a standard industry or sub-industry,
    so 'FMCG', 'Fast Moving Consumer Goods' etc. don't become separate categories."""

    industry = models.ForeignKey(Industry, on_delete=models.CASCADE, null=True, blank=True, related_name='aliases')
    sub_industry = models.ForeignKey(SubIndustry, on_delete=models.CASCADE, null=True, blank=True, related_name='aliases')
    term = models.CharField(max_length=150, db_index=True)

    class Meta:
        verbose_name_plural = 'industry aliases'
        constraints = [
            models.UniqueConstraint(fields=['term'], name='unique_alias_term'),
        ]

    def __str__(self):
        target = self.sub_industry or self.industry
        return f'{self.term} \u2192 {target}'
