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


class Menu(models.Model):
    """Menu model for vendor digital menus"""

    MENU_TYPE_CHOICES = (
        ('food_drinks', 'Food & Drinks'),
        ('beauty_salon', 'Beauty & Salon'),
        ('services', 'Services'),
        ('events', 'Events'),
        ('fitness', 'Fitness'),
        ('other', 'Other'),
    )

    STATUS_CHOICES = (
        ('active', 'Active'),
        ('inactive', 'Inactive'),
        ('deleted', 'Deleted'),
    )

    vendor = models.ForeignKey(
        VendorProfile,
        on_delete=models.CASCADE,
        related_name='menus'
    )
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=300, unique=True, blank=True)
    menu_type = models.CharField(max_length=20, choices=MENU_TYPE_CHOICES)
    description = models.TextField(max_length=500, blank=True)
    logo = models.ImageField(upload_to='menus/', blank=True, null=True)
    cover_image = models.ImageField(upload_to='menu_covers/', blank=True, null=True)
    currency = models.CharField(max_length=3, default='KES')
    show_prices = models.BooleanField(default=True)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='active')
    views = models.IntegerField(default=0)
    qr_scans = models.IntegerField(default=0)

    # Contact overrides (optional - defaults to vendor contact)
    contact_phone = models.CharField(max_length=15, blank=True, null=True)
    contact_whatsapp = models.CharField(max_length=15, blank=True, null=True)

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

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

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

    def save(self, *args, **kwargs):
        if not self.slug:
            base_slug = f"{slugify(self.name)}-{slugify(self.vendor.shop_name)}"
            slug = base_slug
            counter = 1
            while Menu.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 categories_count(self):
        return self.categories.filter(is_active=True).count()

    @property
    def items_count(self):
        return MenuItem.objects.filter(category__menu=self, is_available=True).count()


class MenuCategory(models.Model):
    """Category within a menu"""

    menu = models.ForeignKey(
        Menu,
        on_delete=models.CASCADE,
        related_name='categories'
    )
    name = models.CharField(max_length=100)
    description = models.TextField(max_length=200, blank=True)
    image = models.ImageField(upload_to='menu_categories/', blank=True, null=True)
    display_order = models.IntegerField(default=0)
    is_active = models.BooleanField(default=True)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'menu_categories'
        ordering = ['display_order', 'name']

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


class MenuItem(models.Model):
    """Item within a menu category"""

    PRICE_TYPE_CHOICES = (
        ('fixed', 'Fixed'),
        ('from', 'From'),
        ('varies', 'Varies'),
    )

    category = models.ForeignKey(
        MenuCategory,
        on_delete=models.CASCADE,
        related_name='items'
    )
    name = models.CharField(max_length=200)
    description = models.TextField(max_length=300, blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    price_type = models.CharField(max_length=10, choices=PRICE_TYPE_CHOICES, default='fixed')
    image = models.ImageField(upload_to='menu_items/', blank=True, null=True)
    display_order = models.IntegerField(default=0)
    is_available = models.BooleanField(default=True)
    is_popular = models.BooleanField(default=False)
    is_new = models.BooleanField(default=False)
    is_spicy = models.BooleanField(default=False)
    is_vegetarian = models.BooleanField(default=False)
    views = models.IntegerField(default=0)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'menu_items'
        ordering = ['display_order', 'name']

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


class MenuItemVariant(models.Model):
    """Variant options for menu items (Premium feature)"""

    item = models.ForeignKey(
        MenuItem,
        on_delete=models.CASCADE,
        related_name='variants'
    )
    group_name = models.CharField(max_length=50)  # e.g., "Size", "Add-ons"
    option_name = models.CharField(max_length=50)  # e.g., "Large", "Extra cheese"
    price_adjustment = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    display_order = models.IntegerField(default=0)

    class Meta:
        db_table = 'menu_item_variants'
        ordering = ['group_name', 'display_order']

    def __str__(self):
        return f"{self.item.name} - {self.group_name}: {self.option_name}"


class MenuLike(models.Model):
    """Likes for menus"""

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='menu_likes'
    )
    menu = models.ForeignKey(
        Menu,
        on_delete=models.CASCADE,
        related_name='likes'
    )
    created_at = models.DateTimeField(auto_now_add=True)

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

    def __str__(self):
        return f"{self.user.full_name} likes {self.menu.name}"


class MenuSave(models.Model):
    """Saved menus for users"""

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='menu_saves'
    )
    menu = models.ForeignKey(
        Menu,
        on_delete=models.CASCADE,
        related_name='saves'
    )
    created_at = models.DateTimeField(auto_now_add=True)

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

    def __str__(self):
        return f"{self.user.full_name} saved {self.menu.name}"
