from django.conf import settings
from django.db import models

from apps.core.models import TimeStampedModel


class CommentQuerySet(models.QuerySet):
    def approved(self):
        return self.filter(statut=Comment.Status.APPROUVE)

    def pending(self):
        return self.filter(statut=Comment.Status.EN_ATTENTE)


class Comment(TimeStampedModel):
    class Status(models.TextChoices):
        EN_ATTENTE = "en_attente", "En attente"
        APPROUVE = "approuve", "Approuvé"
        REJETE = "rejete", "Rejeté"
        SPAM = "spam", "Indésirable"

    article = models.ForeignKey("editorial.Article", on_delete=models.CASCADE, related_name="comments")
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="comments")
    parent = models.ForeignKey("self", null=True, blank=True, on_delete=models.CASCADE, related_name="replies")
    nom = models.CharField("nom", max_length=255, blank=True)
    email = models.EmailField("email", blank=True)
    contenu = models.TextField("commentaire")
    statut = models.CharField("statut", max_length=12, choices=Status.choices, default=Status.EN_ATTENTE, db_index=True)
    ip_address = models.GenericIPAddressField(null=True, blank=True)
    modere_par = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="+")
    modere_le = models.DateTimeField(null=True, blank=True)

    objects = CommentQuerySet.as_manager()

    class Meta:
        ordering = ["-created_at"]
        verbose_name = "commentaire"

    def __str__(self):
        return f"{self.author_name} – {self.contenu[:40]}"

    @property
    def author_name(self):
        return self.user.name if self.user_id else (self.nom or "Anonyme")

    @property
    def author_email(self):
        return self.user.email if self.user_id else self.email


class CommentVote(TimeStampedModel):
    class Vote(models.TextChoices):
        UP = "up", "Favorable"
        DOWN = "down", "Défavorable"

    comment = models.ForeignKey(Comment, on_delete=models.CASCADE, related_name="votes")
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.CASCADE, related_name="+")
    ip_address = models.GenericIPAddressField(null=True, blank=True)
    vote = models.CharField(max_length=4, choices=Vote.choices)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=["comment", "user"], name="uniq_vote_user"),
            models.UniqueConstraint(fields=["comment", "ip_address"], name="uniq_vote_ip"),
        ]


class Reaction(TimeStampedModel):
    article = models.ForeignKey("editorial.Article", on_delete=models.CASCADE, related_name="reactions")
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.CASCADE, related_name="+")
    ip_address = models.GenericIPAddressField(null=True, blank=True)
    reaction_type = models.CharField(max_length=20, default="like")

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=["article", "user"], name="uniq_reaction_user"),
            models.UniqueConstraint(fields=["article", "ip_address"], name="uniq_reaction_ip"),
        ]
