from django.db import models
from django.conf import settings
from django.utils.text import slugify
from accounts.models import VendorProfile
from groups.models import Group


class Event(models.Model):
    """Event model for vendor event listings"""

    EVENT_CATEGORY_CHOICES = (
        ('training-workshops', 'Training & Workshops'),
        ('beauty-fashion', 'Beauty & Fashion'),
        ('health-fitness', 'Health & Fitness'),
        ('food-cooking', 'Food & Cooking'),
        ('music-entertainment', 'Music & Entertainment'),
        ('photography-video', 'Photography & Video'),
        ('tech-digital', 'Tech & Digital'),
        ('business-networking', 'Business & Networking'),
        ('kids-family', 'Kids & Family'),
        ('art-craft', 'Art & Craft'),
        ('religious-spiritual', 'Religious & Spiritual'),
        ('sports-outdoor', 'Sports & Outdoor'),
        ('education-tutoring', 'Education & Tutoring'),
        ('other', 'Other'),
    )

    EVENT_TYPE_CHOICES = (
        ('one-time', 'One-Time'),
        ('recurring', 'Recurring'),
        ('on-demand', 'On Demand'),
    )

    LOCATION_TYPE_CHOICES = (
        ('physical', 'Physical'),
        ('online', 'Online'),
        ('both', 'Both'),
    )

    STATUS_CHOICES = (
        ('active', 'Active'),
        ('draft', 'Draft'),
        ('cancelled', 'Cancelled'),
        ('completed', 'Completed'),
    )

    vendor = models.ForeignKey(
        VendorProfile,
        on_delete=models.CASCADE,
        related_name='events'
    )
    group = models.ForeignKey(
        Group,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='member_events'
    )
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=300, unique=True, blank=True)
    category = models.CharField(max_length=30, choices=EVENT_CATEGORY_CHOICES)
    description = models.TextField(max_length=500)

    # Event Type & Scheduling
    event_type = models.CharField(max_length=20, choices=EVENT_TYPE_CHOICES, default='one-time')
    date = models.DateField(blank=True, null=True)  # For one-time events
    time = models.TimeField(blank=True, null=True)
    end_time = models.TimeField(blank=True, null=True)
    recurring_days = models.JSONField(blank=True, null=True)  # For recurring events e.g. ["monday", "wednesday"]
    start_date = models.DateField(blank=True, null=True)  # For recurring events - when it starts
    end_date = models.DateField(blank=True, null=True)  # For recurring events - when it ends (optional)

    # Location
    location_type = models.CharField(max_length=20, choices=LOCATION_TYPE_CHOICES, default='physical')
    venue = models.CharField(max_length=300, blank=True, null=True)
    online_link = models.URLField(blank=True, null=True)
    county = models.CharField(max_length=50)
    town_area = models.CharField(max_length=100)

    # Pricing
    is_free = models.BooleanField(default=False)

    # Media
    image = models.ImageField(upload_to='events/', blank=True, null=True)
    video = models.FileField(upload_to='event_videos/', blank=True, null=True)

    # Stats
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='active')
    views = models.IntegerField(default=0)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'events'
        ordering = ['-created_at']

    def __str__(self):
        return f"{self.title} - {self.vendor.shop_name}"

    def save(self, *args, **kwargs):
        if not self.slug:
            base_slug = f"{slugify(self.title)}-{slugify(self.vendor.shop_name)}"
            slug = base_slug
            counter = 1
            while Event.objects.filter(slug=slug).exclude(pk=self.pk).exists():
                slug = f"{base_slug}-{counter}"
                counter += 1
            self.slug = slug
        super().save(*args, **kwargs)

    @property
    def min_price(self):
        """Get the minimum package price"""
        packages = self.packages.all()
        if not packages:
            return None
        return min(pkg.price for pkg in packages)

    @property
    def max_price(self):
        """Get the maximum package price"""
        packages = self.packages.all()
        if not packages:
            return None
        return max(pkg.price for pkg in packages)


class EventPackage(models.Model):
    """Package/ticket tiers for events"""

    PRICE_TYPE_CHOICES = (
        ('fixed', 'Fixed'),
        ('starting_from', 'Starting From'),
        ('per_person', 'Per Person'),
        ('per_group', 'Per Group'),
        ('negotiable', 'Negotiable'),
    )

    event = models.ForeignKey(
        Event,
        on_delete=models.CASCADE,
        related_name='packages'
    )
    name = models.CharField(max_length=100)  # e.g., "Basic", "Premium", "VIP"
    description = models.TextField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    price_type = models.CharField(max_length=20, choices=PRICE_TYPE_CHOICES, default='fixed')
    whats_included = models.TextField()  # List of what's included
    max_attendees = models.IntegerField(blank=True, null=True)  # Optional capacity
    duration = models.CharField(max_length=100, blank=True, null=True)  # e.g., "2 hours"

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'event_packages'
        ordering = ['price']

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


class EventLike(models.Model):
    """Likes for events"""
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='event_likes'
    )
    event = models.ForeignKey(
        Event,
        on_delete=models.CASCADE,
        related_name='likes'
    )
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'event_likes'
        unique_together = ('user', 'event')
        ordering = ['-created_at']

    def __str__(self):
        return f"{self.user.full_name} likes {self.event.title}"


class EventSave(models.Model):
    """Saved events for users"""
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='event_saves'
    )
    event = models.ForeignKey(
        Event,
        on_delete=models.CASCADE,
        related_name='saves'
    )
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'event_saves'
        unique_together = ('user', 'event')
        ordering = ['-created_at']

    def __str__(self):
        return f"{self.user.full_name} saved {self.event.title}"
