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


class RegisteredMember(models.Model):
    registration_code = models.CharField(max_length=100, unique=True)
    email = models.EmailField()
    full_name = models.CharField(max_length=255)
    event_category = models.ForeignKey(
        'events.EventCategory', on_delete=models.SET_NULL, null=True, blank=True,
        related_name='registered_members',
        help_text='The umbrella event category this member is registered under (e.g. AGM 2026)'
    )
    status = models.CharField(max_length=100, blank=True)
    payment_status = models.CharField(max_length=100, blank=True)
    membership_number = models.CharField(
        max_length=100, blank=True,
        help_text='ICTAZ membership number (from EMS)'
    )
    document_number = models.CharField(
        max_length=100, blank=True,
        help_text='NRC or passport number (from EMS)'
    )
    phone_number = models.CharField(
        max_length=20, blank=True,
        help_text='Phone number (from EMS)'
    )
    package_name = models.CharField(
        max_length=255, blank=True,
        help_text='Determines which sub-events the member may attend (e.g. "Training & Conference", "Training only")'
    )
    package_description = models.TextField(blank=True)
    activity_price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = 'Registered Member'
        verbose_name_plural = 'Registered Members'
        ordering = ['full_name']

    def __str__(self):
        return f'{self.full_name} ({self.registration_code})'

    @property
    def has_attended(self):
        return self.attendance_records.filter(scan_type='CHECK_IN').exists()

    @property
    def is_paid(self):
        return self.payment_status.strip().upper() == 'PAID'

    def get_attendance_status(self, event_id):
        scans = set(
            self.attendance_records.filter(event_id=event_id).values_list('scan_type', flat=True)
        )
        if not scans:
            return None
        if {'CHECK_IN', 'SESSION', 'CHECK_OUT'}.issubset(scans):
            return 'Verified Full Attendance'
        if {'CHECK_IN', 'CHECK_OUT'}.issubset(scans):
            return 'Full Attendance'
        if {'CHECK_IN', 'SESSION'}.issubset(scans):
            return 'Partial Attendance'
        if 'CHECK_IN' in scans:
            return 'Attended Briefly'
        return None


class AttendanceRecord(models.Model):
    SCAN_TYPES = [
        ('CHECK_IN', 'Check-In'),
        ('SESSION', 'Session Verification'),
        ('CHECK_OUT', 'Check-Out'),
    ]

    member = models.ForeignKey(RegisteredMember, on_delete=models.CASCADE, related_name='attendance_records')
    event = models.ForeignKey('events.Event', on_delete=models.CASCADE, related_name='attendance_records')
    scan_type = models.CharField(max_length=20, choices=SCAN_TYPES, default='CHECK_IN')
    scan_time = models.DateTimeField(default=timezone.now)
    recorded_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)

    class Meta:
        unique_together = ['member', 'event', 'scan_type']
        verbose_name = 'Attendance Record'
        verbose_name_plural = 'Attendance Records'
        ordering = ['-scan_time']

    def __str__(self):
        return f'{self.member.full_name} — {self.get_scan_type_display()} @ {self.event.name} [{self.scan_time.strftime("%Y-%m-%d %H:%M")}]'


class ScannerAssignment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='scanner_assignments')
    event = models.ForeignKey('events.Event', on_delete=models.CASCADE, related_name='scanner_assignments')
    is_active = models.BooleanField(default=True)
    assigned_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = ['user', 'event']
        verbose_name = 'Scanner Assignment'
        verbose_name_plural = 'Scanner Assignments'

    def __str__(self):
        return f'{self.user.username} → {self.event.name}'
