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


class LiveSession(models.Model):
    STATUS_CHOICES = (
        ('scheduled', 'Scheduled'),
        ('live', 'Live'),
        ('ended', 'Ended'),
    )

    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    vendor = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='live_sessions',
        limit_choices_to={'user_type': 'vendor'},
    )
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=300, unique=True, blank=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='scheduled')
    agora_channel_name = models.CharField(max_length=200, blank=True)
    agora_uid = models.PositiveIntegerField(default=0)

    scheduled_at = models.DateTimeField(blank=True, null=True)
    started_at = models.DateTimeField(blank=True, null=True)
    ended_at = models.DateTimeField(blank=True, null=True)

    thumbnail = models.ImageField(upload_to='live_thumbnails/', blank=True, null=True)
    replay_video = models.FileField(upload_to='live_replays/', blank=True, null=True)

    # Denormalized stats
    viewer_count = models.PositiveIntegerField(default=0)
    peak_viewers = models.PositiveIntegerField(default=0)
    total_views = models.PositiveIntegerField(default=0)
    replay_views = models.PositiveIntegerField(default=0)
    comments_count = models.PositiveIntegerField(default=0)
    reactions_count = models.PositiveIntegerField(default=0)
    shares_count = models.PositiveIntegerField(default=0)
    new_followers_count = models.PositiveIntegerField(default=0)
    product_views_count = models.PositiveIntegerField(default=0)
    whatsapp_clicks = models.PositiveIntegerField(default=0)
    call_clicks = models.PositiveIntegerField(default=0)

    notify_followers = models.BooleanField(default=True)
    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 = 'live_sessions'
        ordering = ['-created_at']

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

    @property
    def duration_seconds(self):
        if self.started_at and self.ended_at:
            return int((self.ended_at - self.started_at).total_seconds())
        if self.started_at:
            return int((timezone.now() - self.started_at).total_seconds())
        return 0

    @property
    def is_live(self):
        return self.status == 'live'

    @property
    def is_replay(self):
        return self.status == 'ended' and self.replay_video

    def save(self, *args, **kwargs):
        if not self.slug:
            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 LiveSession.objects.filter(slug=slug).exclude(pk=self.pk).exists():
                slug = f"{base_slug}-{counter}"
                counter += 1
            self.slug = slug
        if not self.agora_channel_name:
            self.agora_channel_name = f"live_{self.uuid.hex[:16]}"
        super().save(*args, **kwargs)


class LiveProductPin(models.Model):
    session = models.ForeignKey(LiveSession, on_delete=models.CASCADE, related_name='product_pins')
    product = models.ForeignKey('products.Product', on_delete=models.CASCADE, related_name='live_pins')
    is_currently_pinned = models.BooleanField(default=False)
    pinned_at = models.DateTimeField(blank=True, null=True)
    order = models.PositiveIntegerField(default=0)

    class Meta:
        db_table = 'live_product_pins'
        unique_together = ('session', 'product')
        ordering = ['order']

    def __str__(self):
        return f"{self.product.name} in {self.session.title}"


class LiveComment(models.Model):
    session = models.ForeignKey(LiveSession, on_delete=models.CASCADE, related_name='comments')
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='live_comments')
    content = models.CharField(max_length=500)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'live_comments'
        ordering = ['created_at']

    def __str__(self):
        return f"{self.user.full_name}: {self.content[:50]}"


class LiveReaction(models.Model):
    REACTION_TYPES = (
        ('fire', 'Fire'),
        ('heart', 'Heart'),
        ('heart_eyes', 'Heart Eyes'),
    )

    session = models.ForeignKey(LiveSession, on_delete=models.CASCADE, related_name='reactions')
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='live_reactions')
    reaction_type = models.CharField(max_length=20, choices=REACTION_TYPES)
    created_at = models.DateTimeField(auto_now_add=True)

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

    def __str__(self):
        return f"{self.user.full_name} reacted {self.reaction_type}"


class LiveView(models.Model):
    session = models.ForeignKey(LiveSession, on_delete=models.CASCADE, related_name='live_views')
    viewer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='live_views_as_viewer')
    joined_at = models.DateTimeField(auto_now_add=True)
    left_at = models.DateTimeField(blank=True, null=True)
    is_replay_view = models.BooleanField(default=False)

    class Meta:
        db_table = 'live_views'

    def __str__(self):
        return f"{self.viewer.full_name} watched {self.session.title}"


class LiveAnalyticsEvent(models.Model):
    EVENT_TYPES = (
        ('whatsapp_click', 'WhatsApp Click'),
        ('call_click', 'Call Click'),
        ('product_view', 'Product View'),
        ('share', 'Share'),
    )

    session = models.ForeignKey(LiveSession, on_delete=models.CASCADE, related_name='analytics_events')
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True, blank=True,
        related_name='live_analytics_events',
    )
    event_type = models.CharField(max_length=20, choices=EVENT_TYPES)
    product = models.ForeignKey(
        'products.Product',
        on_delete=models.SET_NULL,
        null=True, blank=True,
        related_name='live_analytics_events',
    )
    created_at = models.DateTimeField(auto_now_add=True)

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

    def __str__(self):
        return f"{self.event_type} on {self.session.title}"
