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


class Offer(models.Model):
    """Offer Model"""
    place = models.ForeignKey(
        'places.Place',
        on_delete=models.CASCADE,
        related_name='offers',
        verbose_name=_('Place')
    )
    title = models.CharField(max_length=200, verbose_name=_('Title'))
    description = models.TextField(verbose_name=_('Description'))
    discount = models.DecimalField(
        max_digits=5,
        decimal_places=2,
        validators=[MinValueValidator(0.0), MaxValueValidator(100.0)],
        verbose_name=_('Discount (%)')
    )
    start_date = models.DateTimeField(verbose_name=_('Start Date'))
    end_date = models.DateTimeField(verbose_name=_('End Date'))
    image = models.ImageField(upload_to='offers/', blank=True, null=True, verbose_name=_('Image'))
    terms = models.JSONField(default=dict, blank=True, verbose_name=_('Terms'))
    is_active = models.BooleanField(default=True, verbose_name=_('Is Active'))
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = _('Offer')
        verbose_name_plural = _('Offers')
        ordering = ['-created_at']
        indexes = [
            models.Index(fields=['place']),
            models.Index(fields=['is_active', 'start_date', 'end_date']),
        ]

    def __str__(self):
        return f'{self.place.name} - {self.title}'

    @property
    def is_valid(self):
        from django.utils import timezone
        now = timezone.now()
        return self.is_active and self.start_date <= now <= self.end_date

    @property
    def days_remaining(self):
        from django.utils import timezone
        if not self.is_valid:
            return None
        delta = self.end_date - timezone.now()
        return delta.days
