from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


class Event(models.Model):
    name = models.CharField(max_length=255, unique=True)
    description = models.TextField(blank=True, null=True)
    date = models.DateField()
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    def __str__(self):
        return self.name


class EventAssignment(models.Model):
    event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='assignments')
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='event_assignments')
    assigned_at = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        unique_together = ['event', 'user']
        verbose_name = 'Event Assignment'
        verbose_name_plural = 'Event Assignments'
    
    def __str__(self):
        return f"{self.user.username} assigned to {self.event.name}"


class RegisteredUser(models.Model):
    registration_code = models.CharField(max_length=100, unique=True)
    email = models.EmailField()
    full_name = models.CharField(max_length=255)
    event_name = models.CharField(max_length=255)
    status = models.CharField(max_length=100)
    payment_status = models.CharField(max_length=100)
    package_name = models.CharField(max_length=100)
    package_description = models.TextField()
    activity_price = models.DecimalField(max_digits=10, decimal_places=2)
    has_attended = models.BooleanField(default=False)
    timestamp = models.DateTimeField(null=True, blank=True)
    
    def __str__(self):
        return f"{self.full_name} ({self.registration_code})"


class Attendance(models.Model):
    user = models.ForeignKey(RegisteredUser, on_delete=models.CASCADE, related_name='attendances')
    event_name = models.CharField(max_length=255)
    check_in_time = models.DateTimeField(auto_now_add=True)
    
    class Meta:
        unique_together = ['user', 'event_name']
        verbose_name_plural = 'Attendance'
    
    def __str__(self):
        return f"{self.user.full_name} - {self.event_name} - {self.check_in_time.strftime('%Y-%m-%d %H:%M')}"
    
    def save(self, *args, **kwargs):
        # Update the has_attended status and timestamp on the user
        if not self.user.has_attended:
            self.user.has_attended = True
            self.user.timestamp = timezone.now()
            self.user.save()
        super().save(*args, **kwargs)


class RegistrationEventAssignment(models.Model):
    """Model to assign registration events to users for attendance scanning"""
    registration_event = models.ForeignKey('registration.Event', on_delete=models.CASCADE, related_name='attendance_assignments')
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='registration_event_assignments')
    assigned_at = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    
    class Meta:
        unique_together = ['registration_event', 'user']
        verbose_name = 'Registration Event Assignment'
        verbose_name_plural = 'Registration Event Assignments'
    
    def __str__(self):
        return f"{self.user.username} assigned to {self.registration_event.name}"
