from django.db import models
from django.utils.text import slugify
from django.utils import timezone
from django.contrib.auth import get_user_model  
from ckeditor.fields import RichTextField
from ckeditor_uploader.fields import RichTextUploadingField

# Create your models here.
User = get_user_model() 

class BlogCategory(models.Model):
    name = models.CharField(max_length=100, unique=True)

    slug = models.SlugField(max_length=120, unique=True, blank=True)

    description = models.TextField(blank=True)

    is_active = models.BooleanField(default=True)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["name"]
        verbose_name_plural = "Blog Categories"

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)

        super().save(*args, **kwargs)

    def __str__(self):
        return self.name
    

class BlogTag(models.Model):
    name = models.CharField(max_length=100, unique=True)

    slug = models.SlugField(max_length=120, unique=True, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["name"]

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)

        super().save(*args, **kwargs)

    def __str__(self):
        return self.name
    
    
class BlogStatus(models.TextChoices):
    DRAFT = "draft", "Draft"
    PUBLISHED = "published", "Published"
    ARCHIVED = "archived", "Archived"


class BlogPost(models.Model):

    title = models.CharField(max_length=300)

    slug = models.SlugField(unique=True, max_length=350, blank=True)

    excerpt = models.TextField(max_length=500)

    content = RichTextUploadingField()

    featured_image = models.ImageField(upload_to="blog/posts/", max_length=255, blank=True, null=True)

    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blog_posts")

    category = models.ForeignKey(BlogCategory, on_delete=models.SET_NULL, null=True, related_name="posts")

    tags = models.ManyToManyField(BlogTag, blank=True, related_name="posts")

    status = models.CharField(max_length=20, choices=BlogStatus.choices, default=BlogStatus.DRAFT)

    is_featured = models.BooleanField(default=False)

    views_count = models.PositiveIntegerField(default=0)

    likes_count = models.PositiveIntegerField(default=0)

    published_at = models.DateTimeField(blank=True, null=True)

    created_at = models.DateTimeField(auto_now_add=True)

    updated_at = models.DateTimeField(auto_now=True)
    
    published_by = models.ForeignKey(User, null=True, blank=True, on_delete=models.SET_NULL, related_name="published_posts")

    created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="created_posts")

    updated_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="updated_posts")

    class Meta:
        ordering = ["-published_at"]

        indexes = [
            models.Index(fields=["status"]),
            models.Index(fields=["slug"]),
            models.Index(fields=["published_at"]),
            models.Index(fields=["is_featured"]),
        ]

    def save(self, *args, **kwargs):

        if not self.slug:
            self.slug = slugify(self.title)

        if (
            self.status == BlogStatus.PUBLISHED
            and self.published_at is None
        ):
            self.published_at = timezone.now()

        super().save(*args, **kwargs)

    @property
    def reading_time(self):

        words = len(self.content.split())

        minutes = max(1, round(words / 200))

        return minutes

    def __str__(self):
        return self.title

    
    
class BlogSEO(models.Model):

    post = models.OneToOneField(
        BlogPost,
        on_delete=models.CASCADE,
        related_name="seo"
    )

    meta_title = models.CharField(
        max_length=60
    )

    meta_description = models.CharField(
        max_length=160
    )

    keywords = models.TextField(
        blank=True
    )

    canonical_url = models.URLField(
        blank=True
    )

    og_title = models.CharField(
        max_length=100,
        blank=True
    )

    og_description = models.TextField(
        blank=True
    )

    og_image = models.ImageField(
        upload_to="blog/seo/",
        blank=True,
        null=True
    )

    def __str__(self):
        return f"SEO - {self.post.title}"


class BlogLike(models.Model):
    blog = models.ForeignKey(BlogPost, on_delete=models.CASCADE, related_name="likes")

    visitor_id = models.CharField(max_length=255)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = (
            "blog",
            "visitor_id"
        )
