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


CATEGORY_CHOICES = (
    ('fashion', 'Fashion & Accessories'),
    ('beauty', 'Beauty & Personal Care'),
    ('electronics', 'Electronics & Gadgets'),
    ('food', 'Food & Drinks'),
    ('home', 'Home & Garden'),
    ('sports', 'Sports & Outdoors'),
    ('books', 'Books & Education'),
    ('vehicles', 'Vehicles'),
    ('phones', 'Phones & Tablets'),
    ('computers', 'Computers'),
    ('health', 'Health'),
    ('services', 'Services'),
    ('gifts', 'Gifts & Custom Items'),
    ('other', 'Other'),
)


class VideoListing(models.Model):
    """Vendor video listing for TikTok-style video commerce"""
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    vendor = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='video_listings',
        limit_choices_to={'user_type': 'vendor'},
    )
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=250, unique=True, blank=True)
    description = models.TextField(max_length=1000, blank=True)
    video = models.FileField(upload_to='video_listings/')
    thumbnail = models.ImageField(upload_to='video_thumbnails/', blank=True, null=True)
    price_min = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    price_max = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    category = models.CharField(max_length=20, choices=CATEGORY_CHOICES, blank=True)
    views_count = models.PositiveIntegerField(default=0)
    likes_count = models.PositiveIntegerField(default=0)
    dislikes_count = models.PositiveIntegerField(default=0)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

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

    def __str__(self):
        return f"{self.title} by {self.vendor.full_name}"

    def save(self, *args, **kwargs):
        if not self.slug:
            # Use shop_name for slug instead of vendor full_name
            shop_name = ''
            if self.vendor_id:
                try:
                    shop_name = slugify(self.vendor.vendor_profile.shop_name)
                except Exception:
                    shop_name = slugify(self.vendor.full_name)
            title_slug = slugify(self.title)
            base_slug = f"{title_slug}-{shop_name}" if shop_name else title_slug
            slug = base_slug
            counter = 1
            while VideoListing.objects.filter(slug=slug).exclude(pk=self.pk).exists():
                slug = f"{base_slug}-{counter}"
                counter += 1
            self.slug = slug
        super().save(*args, **kwargs)


class VideoView(models.Model):
    """Track who viewed a video"""
    video = models.ForeignKey(VideoListing, on_delete=models.CASCADE, related_name='views')
    viewer = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='viewed_videos',
    )
    viewed_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'video_views'
        unique_together = ('video', 'viewer')

    def __str__(self):
        return f"{self.viewer.full_name} viewed {self.video.title}"


class VideoLike(models.Model):
    """Track video likes"""
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='video_likes',
    )
    video = models.ForeignKey(VideoListing, on_delete=models.CASCADE, related_name='likes')
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'video_likes'
        unique_together = ('user', 'video')

    def __str__(self):
        return f"{self.user.full_name} liked {self.video.title}"


class VideoDislike(models.Model):
    """Track video dislikes"""
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='video_dislikes',
    )
    video = models.ForeignKey(VideoListing, on_delete=models.CASCADE, related_name='dislikes')
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'video_dislikes'
        unique_together = ('user', 'video')

    def __str__(self):
        return f"{self.user.full_name} disliked {self.video.title}"


class VideoWishlist(models.Model):
    """Save video to wishlist"""
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='video_wishlist',
    )
    video = models.ForeignKey(VideoListing, on_delete=models.CASCADE, related_name='wishlisted_by')
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'video_wishlist'
        unique_together = ('user', 'video')

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


class VideoReview(models.Model):
    """Buyer video review"""
    buyer = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='video_reviews',
        limit_choices_to={'user_type': 'buyer'},
    )
    product = models.ForeignKey(
        'products.Product',
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='video_reviews',
    )
    video = models.FileField(upload_to='video_reviews/')
    description = models.TextField(max_length=500, blank=True)
    rating = models.PositiveSmallIntegerField(default=5)
    created_at = models.DateTimeField(auto_now_add=True)

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

    def __str__(self):
        return f"Video review by {self.buyer.full_name}"
