from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import post_delete, post_save
from django.dispatch import receiver
from django.urls import reverse
from django.utils.html import strip_tags
from django.utils.text import slugify

from ckeditor.fields import RichTextField

# Blog Category Model
class Category(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


# Blog Tag Model
class Tag(models.Model):
    name = models.CharField(max_length=50)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


 


# Blog Model
class Blog(models.Model):
    slug = models.SlugField(max_length=255, unique=True)
    title = models.CharField(max_length=200)
    meta = models.CharField(max_length=1024, blank=True, null=True)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, related_name="blogs")
    tags = models.ManyToManyField(Tag, blank=True, related_name="blogs")
    author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="blogs")
    content = RichTextField()
    featured_image = models.ImageField(upload_to='blogs/', blank=True, null=True)
    views_count = models.PositiveIntegerField(default=0)
    comments_count = models.PositiveIntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ["-created_at"]

    def save(self, *args, **kwargs):
        if not self.slug:
            base_slug = slugify(self.title) or "blog"
            slug = base_slug
            suffix = 2
            while Blog.objects.exclude(pk=self.pk).filter(slug=slug).exists():
                slug = f"{base_slug}-{suffix}"
                suffix += 1
            self.slug = slug
        super().save(*args, **kwargs)

    def __str__(self):
        return self.title
    
    def get_absolute_url(self):
        return reverse("blog_detail", args=[self.slug])

    @property
    def plain_content(self):
        return strip_tags(self.content or "")

   


# Blog Comment Model
class Comment(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name="comments")
    email = models.EmailField()
    name = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.name} - {self.blog.title}"


# Newsletter Subscription Model
class Subscriber(models.Model):
    email = models.EmailField(unique=True)
    subscribed_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.email


def sync_blog_comment_count(blog_id):
    Blog.objects.filter(pk=blog_id).update(
        comments_count=Comment.objects.filter(blog_id=blog_id).count()
    )


@receiver(post_save, sender=Comment)
def update_comment_count_on_save(sender, instance, **kwargs):
    sync_blog_comment_count(instance.blog_id)


@receiver(post_delete, sender=Comment)
def update_comment_count_on_delete(sender, instance, **kwargs):
    sync_blog_comment_count(instance.blog_id)
