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

# Create your models here.
class Event(models.Model):
    EVENT_TYPES = (
        ('workshop', 'Workshop'),
        ('conference', 'Conference'),
        ('seminar', 'Seminar'),
        ('meeting', 'Meeting'),
        ('other', 'Other'),
    )

    title = models.CharField(max_length=200)
    slug = models.SlugField(unique=True)
    description = models.TextField()
    registration_link = models.URLField(
        max_length=500, 
        blank=True, 
        help_text="External registration link (e.g., Google Form, Eventbrite, etc.)"
    )
    image = models.ImageField(upload_to='events/', null=True, blank=True)
    date = models.DateField(help_text="Select the date of the event")
    time = models.TimeField(help_text="Select the time of the event (24-hour format)")
    location = models.CharField(max_length=200)
    event_type = models.CharField(max_length=100, choices=EVENT_TYPES)
    is_featured = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['date', 'time']

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('events:event_detail', args=[str(self.id)])

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

    @property
    def is_upcoming(self):
        """Check if the event is upcoming."""
        event_datetime = timezone.make_aware(
            timezone.datetime.combine(self.date, self.time)
        )
        return event_datetime > timezone.now()

    @property
    def status(self):
        """Return the event status (upcoming or past)."""
        return 'Upcoming' if self.is_upcoming else 'Past'

    def clean(self):
        """Validate event date and time."""
        if self.date and self.time:
            event_datetime = timezone.make_aware(
                timezone.datetime.combine(self.date, self.time)
            )
            if event_datetime < timezone.now():
                raise ValidationError({
                    'date': 'Event date and time cannot be in the past.',
                    'time': 'Event date and time cannot be in the past.'
                })