from django.db import models
from django.urls import reverse

from apps.core.models import TimeStampedModel
from apps.core.utils import unique_slug


class CategoryQuerySet(models.QuerySet):
    def in_menu(self):
        # Même tri que Laravel : ordre renseigné d'abord, puis par nom.
        return (
            self.filter(est_dans_menu=True)
            .order_by(models.F("ordre").asc(nulls_last=True), "nom")
        )


class Category(TimeStampedModel):
    nom = models.CharField("nom", max_length=255, unique=True)
    slug = models.SlugField(
        "adresse", max_length=255, unique=True, blank=True,
        help_text="Générée à la création. La modifier casse les liens existants.",
    )
    description = models.TextField("description", blank=True)
    couleur = models.CharField(
        "couleur", max_length=10, blank=True,
        choices=[("", "Bleu (défaut)"), ("red", "Rouge"), ("yellow", "Jaune"), ("slate", "Ardoise")],
    )
    est_dans_menu = models.BooleanField("afficher dans le menu", default=False)
    ordre = models.PositiveIntegerField("ordre dans le menu", null=True, blank=True)

    objects = CategoryQuerySet.as_manager()

    class Meta:
        ordering = ["nom"]
        verbose_name = "rubrique"

    def __str__(self):
        return self.nom

    def save(self, *args, **kwargs):
        # Contrairement à Laravel, le slug n'est plus recalculé lors d'un renommage.
        if not self.slug:
            self.slug = unique_slug(Category, self.nom, self.pk, fallback="rubrique")
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse("public:category", args=[self.slug])


class Tag(TimeStampedModel):
    nom = models.CharField("nom", max_length=255)
    slug = models.SlugField("adresse", max_length=255, unique=True, blank=True)

    class Meta:
        ordering = ["nom"]
        verbose_name = "mot-clé"
        verbose_name_plural = "mots-clés"

    def __str__(self):
        return self.nom

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = unique_slug(Tag, self.nom, self.pk, fallback="tag")
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse("public:tag", args=[self.slug])
