from django.db import models
from django.utils.translation import gettext_lazy as _
from django.core.validators import MinValueValidator, MaxValueValidator


class Review(models.Model):
    """Review Model"""
    place = models.ForeignKey(
        'places.Place',
        on_delete=models.CASCADE,
        related_name='reviews',
        verbose_name=_('Place')
    )
    user = models.ForeignKey(
        'accounts.User',
        on_delete=models.CASCADE,
        related_name='reviews',
        verbose_name=_('User')
    )
    rating = models.IntegerField(
        validators=[MinValueValidator(1), MaxValueValidator(5)],
        verbose_name=_('Rating')
    )
    comment = models.TextField(verbose_name=_('Comment'))
    images = models.JSONField(default=list, blank=True, verbose_name=_('Images'))
    helpful_count = models.IntegerField(default=0, verbose_name=_('Helpful Count'))
    is_verified = models.BooleanField(default=False, verbose_name=_('Is Verified'))
    is_active = models.BooleanField(default=True, verbose_name=_('Is Active'))
    place_response = models.TextField(blank=True, null=True, verbose_name=_('Place Response'))
    place_response_at = models.DateTimeField(blank=True, null=True, verbose_name=_('Place Response At'))
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = _('Review')
        verbose_name_plural = _('Reviews')
        ordering = ['-created_at']
        unique_together = ['place', 'user']
        indexes = [
            models.Index(fields=['place']),
            models.Index(fields=['user']),
            models.Index(fields=['rating']),
            models.Index(fields=['is_active']),
        ]

    def __str__(self):
        return f'{self.user.username} - {self.place.name} - {self.rating} stars'

    def save(self, *args, **kwargs):
        is_new = self.pk is None
        super().save(*args, **kwargs)
        if is_new or 'rating' in kwargs.get('update_fields', []):
            # Update place rating
            self.place.update_rating()

    def delete(self, *args, **kwargs):
        place = self.place
        super().delete(*args, **kwargs)
        # Update place rating after deletion
        place.update_rating()


class ReviewHelpful(models.Model):
    """Review Helpful - Track which users found a review helpful"""
    review = models.ForeignKey(
        Review,
        on_delete=models.CASCADE,
        related_name='helpful_votes',
        verbose_name=_('Review')
    )
    user = models.ForeignKey(
        'accounts.User',
        on_delete=models.CASCADE,
        related_name='helpful_votes',
        verbose_name=_('User')
    )
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = _('Review Helpful')
        verbose_name_plural = _('Review Helpful Votes')
        unique_together = ['review', 'user']

    def __str__(self):
        return f'{self.user.username} - {self.review}'
