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


class Market(models.Model):
    """Open market that aggregates products/videos from member vendors."""

    CATEGORY_CHOICES = (
        ('electronics', 'Electronics'),
        ('fashion', 'Fashion & Clothing'),
        ('home', 'Home & Living'),
        ('beauty', 'Beauty & Health'),
        ('food', 'Food & Drinks'),
        ('sports', 'Sports & Outdoors'),
        ('automotive', 'Automotive'),
        ('services', 'Services'),
        ('agriculture', 'Agriculture'),
        ('general', 'General'),
    )

    COUNTY_CHOICES = (
        ('nairobi', 'Nairobi'),
        ('mombasa', 'Mombasa'),
        ('kisumu', 'Kisumu'),
        ('nakuru', 'Nakuru'),
        ('eldoret', 'Eldoret'),
        ('nyeri', 'Nyeri'),
        ('machakos', 'Machakos'),
        ('kiambu', 'Kiambu'),
        ('kilifi', 'Kilifi'),
        ('garissa', 'Garissa'),
        ('thika', 'Thika'),
        ('malindi', 'Malindi'),
        ('kitale', 'Kitale'),
        ('nanyuki', 'Nanyuki'),
        ('other', 'Other'),
    )

    STATUS_CHOICES = (
        ('active', 'Active'),
        ('suspended', 'Suspended'),
        ('deleted', 'Deleted'),
    )

    VENDOR_APPROVAL_CHOICES = (
        ('instant', 'Instant'),
        ('manual', 'Manual'),
    )

    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=120, unique=True, blank=True)
    logo = models.ImageField(upload_to='markets/logos/', blank=True, null=True)
    cover_image = models.ImageField(upload_to='markets/covers/', blank=True, null=True)
    description = models.TextField(max_length=500)
    category = models.CharField(max_length=20, choices=CATEGORY_CHOICES, default='general')
    county = models.CharField(max_length=20, choices=COUNTY_CHOICES, blank=True, null=True)
    town_area = models.CharField(max_length=100, blank=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='active')
    featured = models.BooleanField(default=False)
    vendor_approval = models.CharField(max_length=10, choices=VENDOR_APPROVAL_CHOICES, default='instant')
    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='created_markets',
    )
    vendors_count = models.PositiveIntegerField(default=0)
    products_count = models.PositiveIntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

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

    def __str__(self):
        return self.name

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

    def update_counts(self):
        self.vendors_count = self.vendors.filter(status='active').count()
        active_vendor_ids = self.vendors.filter(status='active').values_list('vendor_id', flat=True)
        from products.models import Product
        self.products_count = Product.objects.filter(
            vendor__user_id__in=active_vendor_ids,
            status='active',
        ).count()
        self.save(update_fields=['vendors_count', 'products_count'])


class MarketVendor(models.Model):
    """Tracks which vendors have joined which markets."""

    STATUS_CHOICES = (
        ('pending', 'Pending'),
        ('active', 'Active'),
        ('suspended', 'Suspended'),
        ('removed', 'Removed'),
    )

    market = models.ForeignKey(Market, on_delete=models.CASCADE, related_name='vendors')
    vendor = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='market_memberships',
    )
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='active')
    joined_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'market_vendors'
        unique_together = ['market', 'vendor']
        ordering = ['-joined_at']

    def __str__(self):
        return f"{self.vendor.full_name} in {self.market.name}"
