from django.db import models
from django.core.exceptions import ValidationError
from django.contrib.auth import get_user_model
from categories.models import Category

User = get_user_model()


class FollowUser(models.Model):
    follower = models.ForeignKey(User, on_delete=models.CASCADE, related_name='following')
    followed = models.ForeignKey(User, on_delete=models.CASCADE, related_name='followers')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        unique_together = ('follower', 'followed')
        verbose_name = "Follow User"
        verbose_name_plural = "Follows Users"
        ordering = ['-created_at']

    def __str__(self):
        return f"{self.follower.username} follows {self.followed.username}"

    def clean(self):
        """Empêcher un utilisateur de se suivre lui-même"""
        if self.follower == self.followed:
            raise ValidationError("Un utilisateur ne peut pas se suivre lui-même.")

    def save(self, *args, **kwargs):
        self.full_clean()  # Appelle clean() avant de sauvegarder
        super().save(*args, **kwargs)


class FollowCategory(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='followed_categories')
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='followed_by')
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = ('user', 'category')
        verbose_name = "Follow Category"
        verbose_name_plural = "Follows Categories"
        ordering = ['-created_at']

    def __str__(self):
        return f"{self.user.username} follows {self.category.title}"