from django.db import models
from django.utils import timezone
from django.urls import reverse
from django.core.exceptions import ValidationError
from django.template.defaultfilters import filesizeformat

def validate_file_size(value):
    # 50MB limit
    max_size = 50 * 1024 * 1024  # 50MB in bytes
    if value.size > max_size:
        raise ValidationError(f'File size cannot exceed {filesizeformat(max_size)}. Your file size is {filesizeformat(value.size)}.')

class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)
    description = models.TextField(blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

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

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('publications:category_detail', args=[self.slug])

class Publication(models.Model):
    STATUS_CHOICES = (
        ('active', 'Active'),
        ('archived', 'Archived'),
    )

    title = models.CharField(max_length=255)
    slug = models.SlugField(unique=True)
    description = models.TextField()
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='publications')
    document = models.FileField(
        upload_to='publications/documents/%Y/%m/',
        validators=[validate_file_size],
        help_text='Maximum file size: 50MB. Allowed formats: PDF, DOC, DOCX'
    )
    file_size = models.CharField(max_length=20, blank=True)  # Will be auto-populated
    download_count = models.PositiveIntegerField(default=0)
    published_date = models.DateField(default=timezone.now)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    status = models.CharField(
        max_length=10, 
        choices=STATUS_CHOICES, 
        default='active',
        help_text='Set to archived to hide from public view'
    )

    class Meta:
        ordering = ['-published_date']
        indexes = [
            models.Index(fields=['status', 'published_date']),
            models.Index(fields=['category', 'status']),
        ]

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('publications:publication_detail', args=[self.slug])

    def save(self, *args, **kwargs):
        if self.document:
            # Convert file size to human-readable format
            size_bytes = self.document.size
            for unit in ['B', 'KB', 'MB', 'GB']:
                if size_bytes < 1024:
                    self.file_size = f"{size_bytes:.2f} {unit}"
                    break
                size_bytes /= 1024
        super().save(*args, **kwargs)