from django.db import models
from django.utils import timezone
from django.utils.text import slugify


class FeedbackEvent(models.Model):
    """
    Independent event model for feedback collection.
    Completely decoupled from other modules — admin creates these
    specifically for each feedback campaign.
    """
    name = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, unique=True, blank=True)
    description = models.TextField(blank=True)
    is_active = models.BooleanField(default=True)
    is_stats_published = models.BooleanField(default=False, help_text='If true, the public stats page is live.')
    is_archived = models.BooleanField(default=False)
    archived_at = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-created_at']
        verbose_name = 'Feedback Event'
        verbose_name_plural = 'Feedback Events'

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        super().save(*args, **kwargs)

    def archive(self):
        self.is_archived = True
        self.is_active = False
        self.archived_at = timezone.now()
        self.save(update_fields=['is_archived', 'is_active', 'archived_at'])

    def unarchive(self):
        self.is_archived = False
        self.is_active = True
        self.archived_at = None
        self.save(update_fields=['is_archived', 'is_active', 'archived_at'])

    @property
    def feedback_count(self):
        return self.feedbacks.count()


class FeedbackCategory(models.Model):
    name = models.CharField(max_length=100, unique=True)
    description = models.TextField(blank=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = 'Feedback Category'
        verbose_name_plural = 'Feedback Categories'
        ordering = ['name']

    def __str__(self):
        return self.name


class Feedback(models.Model):
    RATING_CHOICES = (
        (1, '1 - Very Poor'),
        (2, '2 - Poor'),
        (3, '3 - Average'),
        (4, '4 - Good'),
        (5, '5 - Excellent'),
    )

    feedback_event = models.ForeignKey(FeedbackEvent, on_delete=models.CASCADE, related_name='feedbacks')
    category = models.ForeignKey(FeedbackCategory, on_delete=models.SET_NULL, null=True, blank=True)
    rating = models.PositiveSmallIntegerField(choices=RATING_CHOICES, default=3)
    comment = models.TextField()

    name = models.CharField(max_length=255, blank=True)
    email = models.EmailField(blank=True)
    registration_code = models.CharField(max_length=100, blank=True)
    is_anonymous = models.BooleanField(default=False)

    ip_address = models.GenericIPAddressField(blank=True, null=True)
    is_published = models.BooleanField(default=True)
    created_at = models.DateTimeField(default=timezone.now)

    class Meta:
        ordering = ['-created_at']
        indexes = [
            models.Index(fields=['feedback_event', 'created_at']),
            models.Index(fields=['rating']),
        ]

    def __str__(self):
        submitter = 'Anonymous' if self.is_anonymous else (self.name or self.email or 'Unknown')
        return f'Feedback from {submitter} — {self.feedback_event.name}'


class FeedbackConfiguration(models.Model):
    """Singleton configuration for the active feedback event."""
    active_event = models.ForeignKey(
        FeedbackEvent, on_delete=models.SET_NULL, null=True, blank=True,
        related_name='active_configs'
    )
    feedback_enabled = models.BooleanField(default=True)
    welcome_message = models.TextField(
        default='Welcome! Your feedback helps us improve future events.'
    )
    thank_you_message = models.TextField(
        default='Thank you for your feedback! We truly appreciate your input.'
    )
    disabled_message = models.TextField(
        default='Feedback collection is currently closed. Please check back later.'
    )
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = 'Feedback Configuration'
        verbose_name_plural = 'Feedback Configuration'

    def __str__(self):
        return f'Feedback Config — Active: {self.active_event}'

    @classmethod
    def get_config(cls):
        config, _ = cls.objects.get_or_create(id=1, defaults={'feedback_enabled': True})
        return config
