from django.db import models
from django.utils import timezone
from users.models import Partner

class EventCategory(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(blank=True, null=True)
    icon = models.CharField(max_length=50, blank=True, null=True)  # For FontAwesome icons
    
    def __str__(self):
        return self.name
    
    class Meta:
        verbose_name_plural = "Event Categories"

# Add to your Event model
WILAYA_CHOICES = [
    ('01', 'Adrar'),
    ('02', 'Chlef'),
    ('03', 'Laghouat'),
    ('04', 'Oum El Bouaghi'),
    ('05', 'Batna'),
    ('06', 'Béjaïa'),
    ('07', 'Biskra'),
    ('08', 'Béchar'),
    ('09', 'Blida'),
    ('10', 'Bouira'),
    ('11', 'Tamanrasset'),
    ('12', 'Tébessa'),
    ('13', 'Tlemcen'),
    ('14', 'Tiaret'),
    ('15', 'Tizi Ouzou'),
    ('16', 'Alger'),
    ('17', 'Djelfa'),
    ('18', 'Jijel'),
    ('19', 'Sétif'),
    ('20', 'Saïda'),
    ('21', 'Skikda'),
    ('22', 'Sidi Bel Abbès'),
    ('23', 'Annaba'),
    ('24', 'Guelma'),
    ('25', 'Constantine'),
    ('26', 'Médéa'),
    ('27', 'Mostaganem'),
    ('28', 'M\'Sila'),
    ('29', 'Mascara'),
    ('30', 'Ouargla'),
    ('31', 'Oran'),
    ('32', 'El Bayadh'),
    ('33', 'Illizi'),
    ('34', 'Bordj Bou Arréridj'),
    ('35', 'Boumerdès'),
    ('36', 'El Tarf'),
    ('37', 'Tindouf'),
    ('38', 'Tissemsilt'),
    ('39', 'El Oued'),
    ('40', 'Khenchela'),
    ('41', 'Souk Ahras'),
    ('42', 'Tipaza'),
    ('43', 'Mila'),
    ('44', 'Aïn Defla'),
    ('45', 'Naâma'),
    ('46', 'Aïn Témouchent'),
    ('47', 'Ghardaïa'),
    ('48', 'Relizane'),
    ('49', 'El M\'Ghair'),
    ('50', 'El Meniaa'),
    ('51', 'Ouled Djellal'),
    ('52', 'Bordj Baji Mokhtar'),
    ('53', 'Béni Abbès'),
    ('54', 'Timimoun'),
    ('55', 'Touggourt'),
    ('56', 'Djanet'),
    ('57', 'In Salah'),
    ('58', 'In Guezzam'),
]

class Event(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    date = models.DateField()
    time = models.TimeField(null=True)
    location = models.CharField(max_length=200)
    wilaya = models.CharField(max_length=2, choices=WILAYA_CHOICES, default='16')  # Default to Alger
    image = models.ImageField(upload_to='media/events/', blank=True, null=True)
    is_featured = models.BooleanField(default=False)
    price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    partner = models.ForeignKey(Partner, on_delete=models.CASCADE, related_name='events', null=True, blank=True)
    category = models.ForeignKey(EventCategory, on_delete=models.SET_NULL, related_name='events', null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    available_seats = models.PositiveIntegerField(null=True, blank=True)
    is_sold_out = models.BooleanField(default=False)
    registration_closed = models.BooleanField(default=False)
    
    def __str__(self):
        return self.title
    
    @property
    def reservation_count(self):
        """Return the total number of reservations for this event"""
        return self.reservations.count()
    
    @property
    def confirmed_reservation_count(self):
        """Return the number of confirmed reservations for this event"""
        return self.reservations.filter(status='confirmed').count()
    
    @property
    def formatted_date(self):
        try:
            # Format date in French style
            months = [
                'janvier', 'février', 'mars', 'avril', 'mai', 'juin',
                'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'
            ]
            day = self.date.day
            month = months[self.date.month - 1]
            year = self.date.year
            return f"{day} {month} {year}"
        except (AttributeError, IndexError):
            return "Date non disponible"
    
    @property
    def is_upcoming(self):
        try:
            return self.date >= timezone.now().date()
        except:
            return False
    
    @property
    def is_past(self):
        try:
            return self.date < timezone.now().date()
        except:
            return False
            
    @property
    def partner_name(self):
        """Return the partner name or 'Delta Trae' if no partner is assigned"""
        if self.partner:
            return self.partner.name
        return "Delta Trae"
from django.db import models
from users.models import User

class EventReservation(models.Model):
    PENDING = 'pending'
    CONFIRMED = 'confirmed'
    CANCELLED = 'cancelled'
    PAYMENT_SUBMITTED = 'payment_submitted'
    
    STATUS_CHOICES = [
        (PENDING, 'Pending'),
        (PAYMENT_SUBMITTED, 'Payment Submitted'),
        (CONFIRMED, 'Confirmed'),
        (CANCELLED, 'Cancelled'),
    ]
    
    event = models.ForeignKey('Event', on_delete=models.CASCADE, related_name='reservations')
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='event_reservations')
    name = models.CharField(max_length=255, blank=True, null=True)
    phone = models.CharField(max_length=20, blank=True, null=True)
    reserved_seats = models.PositiveIntegerField(default=1)
    medical_information = models.TextField(blank=True, null=True)
    reservation_date = models.DateTimeField(auto_now_add=True)
    event_date = models.DateField(blank=True, null=True)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default=PENDING)
    payment_proof = models.FileField(upload_to='media/payment_proofs/', blank=True, null=True)
    
    def __str__(self):
        return f"{self.user.username} - {self.event.title}"
