import os
import qrcode
from django.db import models
from django.conf import settings
from .utils import merge_qr_with_invite

class RSVP(models.Model):
    full_name = models.CharField(max_length=200, help_text="Full name of the attendee")
    email = models.EmailField(unique=True, help_text="Email address of the attendee")
    phone = models.CharField(max_length=20, help_text="Phone number of the attendee")
    country_code = models.CharField(max_length=5, help_text="Country code for the phone number", blank=True, null=True)
    guests = models.CharField(max_length=2, null=True, blank=True, help_text="Number of guests")
    WHICH_EVENT_CHOICES = [
        ('night_of_tribute', 'Night of Tribute (June 11)'),
        ('thanksgiving', 'Thanksgiving Service (June 12)'),
        ('both', 'Both Gatherings'),
    ]
    which_event = models.CharField(
        max_length=20,
        choices=WHICH_EVENT_CHOICES,
        blank=True,
        default='',
        help_text="Which gathering the attendee will attend",
    )
    ticket_number = models.CharField(max_length=20, unique=True)
    qr_code = models.ImageField(upload_to='qr_codes/', blank=True, null=True)
    access_card = models.ImageField(upload_to='access/', blank=True, null=True)
    message_sid = models.CharField(max_length=255, blank=True, null=True)
    is_sent = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-created_at']
        verbose_name = 'RSVP'
        verbose_name_plural = 'RSVPs'

    def __str__(self):
        return f"{self.full_name}"

    def save(self, *args, **kwargs):
        if not self.ticket_number:
            import secrets
            import string
            self.ticket_number = ''.join(secrets.choice(string.ascii_letters + string.digits) for _ in range(9))
        if not self.qr_code:
            qr = qrcode.QRCode(
                version=1,
                error_correction=qrcode.constants.ERROR_CORRECT_L,
                box_size=10,
                border=1,
            )
            qr.add_data(self.ticket_number)
            qr.make(fit=True)
            img = qr.make_image(fill='black', back_color='white')
            qr_path = os.path.join(settings.MEDIA_ROOT, 'qr_codes', f'{self.ticket_number}.png')
            os.makedirs(os.path.dirname(qr_path), exist_ok=True)
            img.save(qr_path)
            self.qr_code = f'qr_codes/{self.ticket_number}.png'

            # Generate access card by merging QR with invite template (if card.png exists)
            invite_path = os.path.join(settings.MEDIA_ROOT, 'card.png')
            qr_code_path = qr_path
            output_path = os.path.join(settings.MEDIA_ROOT, 'access', f'{self.ticket_number}.png')
            merge_qr_with_invite(invite_path, qr_code_path, output_path)
            self.access_card = f'access/{self.ticket_number}.png'
        super().save(*args, **kwargs)

class Accreditation(models.Model):
    rsvp = models.ForeignKey(RSVP, on_delete=models.CASCADE, related_name='accreditations', null=True, blank=True)
    date = models.DateTimeField(auto_now_add=True, editable=False, blank=False)
    is_accredited = models.BooleanField(default=False)
    time = models.TimeField(auto_now_add=True, editable=False, blank=False)

    def __str__(self):
        if self.rsvp:
            return f"{self.rsvp.full_name} - {self.date} {self.time}"
        return f"Accreditation - {self.date} {self.time}"

    class Meta:
        unique_together = (('rsvp', 'date'))
        ordering = ['-date', '-time']

class Invite(models.Model):
    name = models.CharField(max_length=255)
    email = models.EmailField(null=True, blank=True)
    phone = models.CharField(max_length=20, null=True, blank=True)
    is_invited = models.BooleanField(default=False)
    message_sid = models.CharField(max_length=255, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True, editable=False, blank=False)

    def __str__(self):
        return f"{self.name} - {self.phone}"

    class Meta:
        ordering = ['-created_at']
