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


class RaffleEvent(models.Model):
    name = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, unique=True, blank=True)
    description = models.TextField(blank=True)
    is_active = models.BooleanField(default=True)
    is_archived = models.BooleanField(default=False)
    archived_at = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-created_at']
        verbose_name = 'Raffle Event'
        verbose_name_plural = 'Raffle Events'

    def __str__(self):
        return self.name

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

    def archive(self):
        self.is_archived = True
        self.is_active = False
        self.archived_at = timezone.now()
        self.save(update_fields=['is_archived', 'is_active', 'archived_at'])

    @property
    def entry_count(self):
        return self.entries.count()


class RaffleEntry(models.Model):
    event = models.ForeignKey(RaffleEvent, on_delete=models.CASCADE, related_name='entries')
    registration_code = models.CharField(max_length=100)
    full_name = models.CharField(max_length=255, blank=True)
    scanned_at = models.DateTimeField(auto_now_add=True)
    ip_address = models.GenericIPAddressField(null=True, blank=True)

    class Meta:
        ordering = ['-scanned_at']
        unique_together = [('event', 'registration_code')]
        verbose_name = 'Raffle Entry'
        verbose_name_plural = 'Raffle Entries'

    def __str__(self):
        return f'{self.full_name or self.registration_code} — {self.event.name}'
