from django.conf import settings
from django.core.cache import cache
from django.db import models
from django.urls import reverse
from django.utils import timezone


class TimeStampedModel(models.Model):
    created_at = models.DateTimeField("créé le", default=timezone.now, editable=False)
    updated_at = models.DateTimeField("modifié le", auto_now=True)

    class Meta:
        abstract = True


class SoftDeleteQuerySet(models.QuerySet):
    def alive(self):
        return self.filter(deleted_at__isnull=True)

    def trashed(self):
        return self.filter(deleted_at__isnull=False)


class SoftDeleteModel(models.Model):
    """Corbeille : l'objet est masqué mais restaurable jusqu'à sa suppression définitive."""

    deleted_at = models.DateTimeField("mis à la corbeille le", null=True, blank=True, db_index=True)
    deleted_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="+"
    )

    class Meta:
        abstract = True

    @property
    def is_trashed(self):
        return self.deleted_at is not None

    def trash(self, user=None):
        self.deleted_at = timezone.now()
        self.deleted_by = user
        self.save(update_fields=["deleted_at", "deleted_by", "updated_at"])

    def restore(self):
        self.deleted_at = None
        self.deleted_by = None
        self.save(update_fields=["deleted_at", "deleted_by", "updated_at"])


class SiteSettings(models.Model):
    """Paramètres éditables du site (singleton, pk=1)."""

    CACHE_KEY = "core.site_settings"

    site_name = models.CharField("nom du site", max_length=120, default="Label Info TV")
    slogan = models.CharField("slogan", max_length=200, blank=True, default="L'information vérifiée, au cœur du Bénin")
    site_description = models.TextField("description (SEO)", blank=True)
    contact_email = models.EmailField("email de contact", blank=True)
    contact_phone = models.CharField("téléphone", max_length=50, blank=True)
    contact_address = models.CharField("adresse", max_length=255, blank=True, default="Cotonou, Bénin")

    facebook_url = models.URLField("Facebook", blank=True)
    twitter_url = models.URLField("X / Twitter", blank=True)
    linkedin_url = models.URLField("LinkedIn", blank=True)
    youtube_url = models.URLField("YouTube", blank=True)
    instagram_url = models.URLField("Instagram", blank=True)
    tiktok_url = models.URLField("TikTok", blank=True)

    youtube_channel_url = models.URLField(
        "chaîne YouTube (WebTV)", blank=True, default="https://www.youtube.com/@LabelinfoTV-h9x"
    )
    youtube_live_id = models.CharField(
        "ID de la vidéo en direct", max_length=40, blank=True,
        help_text="Identifiant YouTube du direct en cours (laisser vide hors direct).",
    )

    logo = models.ImageField("logo", upload_to="settings/", blank=True)
    favicon = models.ImageField("favicon", upload_to="settings/", blank=True)

    investigation_title = models.CharField("titre du bloc d'accueil thématique", max_length=80, default="Investigations")
    investigation_categories = models.ManyToManyField(
        "taxonomy.Category", blank=True, related_name="+",
        verbose_name="rubriques du bloc thématique",
        help_text="Rubriques mises en avant sur la page d'accueil.",
    )

    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "paramètres du site"
        verbose_name_plural = "paramètres du site"

    def __str__(self):
        return self.site_name

    def save(self, *args, **kwargs):
        self.pk = 1
        super().save(*args, **kwargs)
        cache.delete(self.CACHE_KEY)

    @classmethod
    def load(cls):
        obj = cache.get(cls.CACHE_KEY)
        if obj is None:
            obj, _ = cls.objects.get_or_create(pk=1)
            cache.set(cls.CACHE_KEY, obj, 60 * 30)
        return obj

    @property
    def social_links(self):
        pairs = [
            ("facebook", "Facebook", self.facebook_url),
            ("twitter", "X", self.twitter_url),
            ("linkedin", "LinkedIn", self.linkedin_url),
            ("youtube", "YouTube", self.youtube_url or self.youtube_channel_url),
            ("instagram", "Instagram", self.instagram_url),
            ("tiktok", "TikTok", self.tiktok_url),
        ]
        return [{"key": k, "label": label, "url": url} for k, label, url in pairs if url]


class Page(TimeStampedModel):
    """Pages institutionnelles éditables (à propos, mentions légales…)."""

    slug = models.SlugField("adresse", max_length=80, unique=True)
    titre = models.CharField("titre", max_length=200)
    chapo = models.CharField("sous-titre", max_length=300, blank=True)
    contenu = models.TextField("contenu")
    est_publiee = models.BooleanField("publiée", default=True)
    dans_footer = models.BooleanField("lien dans le pied de page", default=True)
    ordre = models.PositiveIntegerField("ordre", default=0)

    class Meta:
        ordering = ["ordre", "titre"]
        verbose_name = "page"

    def __str__(self):
        return self.titre

    LEGACY_URLS = {
        "a-propos": "public:about",
        "mentions-legales": "public:legal",
        "confidentialite": "public:privacy",
        "cgu": "public:terms",
    }

    def get_absolute_url(self):
        if name := self.LEGACY_URLS.get(self.slug):
            return reverse(name)
        return reverse("public:page", args=[self.slug])


class Service(models.Model):
    class Icon(models.TextChoices):
        VIDEO = "video", "Vidéo"
        CAMERA = "camera", "Caméra"
        DRONE = "drone", "Drone"
        FILM = "film", "Film"
        CHART = "chart", "Graphique"
        SERVER = "server", "Serveur"
        MEGAPHONE = "megaphone", "Mégaphone"
        GLOBE = "globe", "Globe"

    titre = models.CharField("titre", max_length=150)
    description = models.TextField("description")
    icone = models.CharField("icône", max_length=20, choices=Icon.choices, default=Icon.VIDEO)
    ordre = models.PositiveIntegerField("ordre", default=0)
    actif = models.BooleanField("affiché", default=True)

    class Meta:
        ordering = ["ordre", "id"]
        verbose_name = "service"

    def __str__(self):
        return self.titre
