import uuid

from django.conf import settings
from django.db import models

from apps.core.models import BaseModel


# ---------------------------------------------------------------------------
# Events
# ---------------------------------------------------------------------------

class Event(BaseModel):
    """Gym event (workshop, seminar, competition, etc.)."""

    class EventType(models.TextChoices):
        WORKSHOP = "workshop", "Workshop"
        SEMINAR = "seminar", "Seminar"
        COMPETITION = "competition", "Competition"
        SOCIAL = "social", "Social"
        CHARITY = "charity", "Charity"
        OPEN_DAY = "open_day", "Open Day"
        OTHER = "other", "Other"

    name = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    event_type = models.CharField(
        max_length=20,
        choices=EventType.choices,
        default=EventType.OTHER,
    )
    location = models.ForeignKey(
        "core.Location",
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        related_name="events",
    )
    venue = models.CharField(max_length=255, blank=True)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    capacity = models.PositiveIntegerField(default=0)
    registered_count = models.PositiveIntegerField(default=0)
    price = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        null=True,
        blank=True,
    )
    image = models.ImageField(upload_to="events/images/", blank=True, null=True)
    is_free = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    organizer = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        related_name="organized_events",
    )
    registration_deadline = models.DateTimeField(blank=True, null=True)

    class Meta(BaseModel.Meta):
        verbose_name = "Event"
        verbose_name_plural = "Events"

    def __str__(self):
        return self.name


# ---------------------------------------------------------------------------
# Event Registration
# ---------------------------------------------------------------------------

class EventRegistration(BaseModel):
    """Registration for an event by a member or guest."""

    class Status(models.TextChoices):
        REGISTERED = "registered", "Registered"
        CONFIRMED = "confirmed", "Confirmed"
        ATTENDED = "attended", "Attended"
        CANCELLED = "cancelled", "Cancelled"
        WAITLISTED = "waitlisted", "Waitlisted"

    event = models.ForeignKey(
        Event,
        on_delete=models.CASCADE,
        related_name="registrations",
    )
    member = models.ForeignKey(
        "members.MemberProfile",
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        related_name="event_registrations",
    )
    guest_name = models.CharField(max_length=255, blank=True)
    guest_email = models.EmailField(blank=True)
    guest_phone = models.CharField(max_length=20, blank=True)
    status = models.CharField(
        max_length=20,
        choices=Status.choices,
        default=Status.REGISTERED,
    )
    ticket_code = models.CharField(max_length=100, unique=True)
    paid = models.BooleanField(default=False)
    payment = models.ForeignKey(
        "billing.Payment",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="event_registrations",
    )
    checked_in = models.BooleanField(default=False)
    checked_in_at = models.DateTimeField(blank=True, null=True)

    class Meta(BaseModel.Meta):
        verbose_name = "Event Registration"
        verbose_name_plural = "Event Registrations"

    def __str__(self):
        return f"{self.member or self.guest_name} - {self.event}"


# ---------------------------------------------------------------------------
# Event Ticket Types
# ---------------------------------------------------------------------------

class EventTicketType(BaseModel):
    """Ticket type / tier for an event."""

    event = models.ForeignKey(
        Event,
        on_delete=models.CASCADE,
        related_name="ticket_types",
    )
    name = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    capacity = models.PositiveIntegerField(default=0)
    sold_count = models.PositiveIntegerField(default=0)
    description = models.TextField(blank=True)

    class Meta(BaseModel.Meta):
        verbose_name = "Event Ticket Type"
        verbose_name_plural = "Event Ticket Types"

    def __str__(self):
        return f"{self.event} - {self.name}"


# ---------------------------------------------------------------------------
# Kids Programs
# ---------------------------------------------------------------------------

class KidsProgram(BaseModel):
    """Kids fitness / activity program."""

    name = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    age_min = models.PositiveIntegerField(default=0)
    age_max = models.PositiveIntegerField(default=0)
    location = models.ForeignKey(
        "core.Location",
        on_delete=models.CASCADE,
        related_name="kids_programs",
    )
    instructor = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="kids_programs",
    )
    capacity = models.PositiveIntegerField(default=0)
    schedule = models.JSONField(
        default=dict,
        blank=True,
        help_text="Weekly schedule configuration",
    )
    price_per_session = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    monthly_price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    is_active = models.BooleanField(default=True)
    image = models.ImageField(upload_to="kids/programs/", blank=True, null=True)

    class Meta(BaseModel.Meta):
        verbose_name = "Kids Program"
        verbose_name_plural = "Kids Programs"

    def __str__(self):
        return self.name


# ---------------------------------------------------------------------------
# Kids Enrollment
# ---------------------------------------------------------------------------

class KidsEnrollment(BaseModel):
    """Enrollment of a child in a kids program."""

    class Status(models.TextChoices):
        ACTIVE = "active", "Active"
        INACTIVE = "inactive", "Inactive"
        WAITLISTED = "waitlisted", "Waitlisted"

    program = models.ForeignKey(
        KidsProgram,
        on_delete=models.CASCADE,
        related_name="enrollments",
    )
    child_name = models.CharField(max_length=255)
    child_age = models.PositiveIntegerField(default=0)
    parent = models.ForeignKey(
        "members.MemberProfile",
        on_delete=models.CASCADE,
        related_name="kids_enrollments",
    )
    emergency_contact_name = models.CharField(max_length=255, blank=True)
    emergency_contact_phone = models.CharField(max_length=20, blank=True)
    medical_notes = models.TextField(blank=True)
    allergies = models.TextField(blank=True)
    pickup_authorized_persons = models.JSONField(
        default=list,
        blank=True,
        help_text="List of persons authorized to pick up the child",
    )
    status = models.CharField(
        max_length=20,
        choices=Status.choices,
        default=Status.ACTIVE,
    )
    start_date = models.DateField()
    end_date = models.DateField(blank=True, null=True)

    class Meta(BaseModel.Meta):
        verbose_name = "Kids Enrollment"
        verbose_name_plural = "Kids Enrollments"

    def __str__(self):
        return f"{self.child_name} - {self.program}"


# ---------------------------------------------------------------------------
# Kids Attendance
# ---------------------------------------------------------------------------

class KidsAttendance(BaseModel):
    """Attendance record for a child in a kids program."""

    enrollment = models.ForeignKey(
        KidsEnrollment,
        on_delete=models.CASCADE,
        related_name="attendance_records",
    )
    date = models.DateField()
    check_in = models.DateTimeField()
    check_out = models.DateTimeField(blank=True, null=True)
    picked_up_by = models.CharField(max_length=255, blank=True)
    notes = models.TextField(blank=True)

    class Meta(BaseModel.Meta):
        verbose_name = "Kids Attendance"
        verbose_name_plural = "Kids Attendance Records"

    def __str__(self):
        return f"{self.enrollment.child_name} - {self.date}"
