from django.db import models
from django.utils.text import slugify
from django.utils import timezone
from tinymce.models import HTMLField


class Category(models.Model):
    """Category model for organizing news and events"""
    name = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True, blank=True)
    description = models.TextField(blank=True, null=True)
    featured_image = models.ImageField(
        upload_to='news/categories/',
        blank=True,
        null=True,
        help_text='Optional image representing the category'
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name_plural = "Categories"
        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 News(models.Model):
    """News and Events model"""
    title = models.CharField(max_length=255, help_text="Title for SEO")
    slug = models.SlugField(max_length=255, unique=True, blank=True)
    short_description = models.CharField(
        max_length=500, 
        help_text="Short description for SEO (meta description)"
    )
    description = HTMLField(help_text="Full content/description with rich text editor")
    category = models.ForeignKey(
        Category, 
        on_delete=models.SET_NULL, 
        null=True, 
        related_name='news_items'
    )
    publish_date = models.DateTimeField(
        default=timezone.now,
        help_text="Date and time when the news/event is published"
    )
    featured_image = models.ImageField(
        upload_to='news/featured/',
        blank=True,
        null=True,
        help_text="Main featured image for the news/event"
    )
    is_active = models.BooleanField(default=True, help_text="Whether the news is active/published")
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name_plural = "News"
        ordering = ['-publish_date', '-created_at']

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

    def get_featured_image_url(self, request=None):
        """Return featured image URL or default placeholder"""
        if self.featured_image:
            if request:
                return request.build_absolute_uri(self.featured_image.url)
            return self.featured_image.url
        return "https://placehold.co/1200x750"

    def __str__(self):
        return self.title


class ImageGallery(models.Model):
    """Image gallery for multiple images per news/event"""
    news = models.ForeignKey(
        News, 
        on_delete=models.CASCADE, 
        related_name='gallery_images'
    )
    image = models.ImageField(
        upload_to='news/gallery/',
        help_text="Gallery image"
    )
    caption = models.CharField(
        max_length=255, 
        blank=True, 
        null=True,
        help_text="Optional caption for the image"
    )
    order = models.PositiveIntegerField(
        default=0,
        help_text="Order of image display"
    )
    uploaded_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = "Image Galleries"
        ordering = ['order', 'uploaded_at']

    def __str__(self):
        return f"Image for {self.news.title}"
