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


class BookingType(models.TextChoices):
    TABLE = 'table', _('Table')
    APPOINTMENT = 'appointment', _('Appointment')
    SIMPLE = 'simple', _('Simple')


class BookingStatus(models.TextChoices):
    PENDING = 'pending', _('Pending')
    CONFIRMED = 'confirmed', _('Confirmed')
    CANCELLED = 'cancelled', _('Cancelled')
    COMPLETED = 'completed', _('Completed')


class Booking(models.Model):
    """Booking Model"""
    place = models.ForeignKey(
        'places.Place',
        on_delete=models.CASCADE,
        related_name='bookings',
        verbose_name=_('Place')
    )
    user = models.ForeignKey(
        'accounts.User',
        on_delete=models.CASCADE,
        related_name='bookings',
        verbose_name=_('User')
    )
    type = models.CharField(
        max_length=20,
        choices=BookingType.choices,
        default=BookingType.SIMPLE,
        verbose_name=_('Type')
    )
    date = models.DateField(verbose_name=_('Date'))
    time = models.TimeField(verbose_name=_('Time'))
    number_of_guests = models.IntegerField(
        blank=True,
        null=True,
        validators=[MinValueValidator(1)],
        verbose_name=_('Number of Guests')
    )
    special_requests = models.TextField(blank=True, null=True, verbose_name=_('Special Requests'))
    status = models.CharField(
        max_length=20,
        choices=BookingStatus.choices,
        default=BookingStatus.PENDING,
        verbose_name=_('Status')
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = _('Booking')
        verbose_name_plural = _('Bookings')
        ordering = ['-created_at']
        indexes = [
            models.Index(fields=['place', 'date']),
            models.Index(fields=['user']),
            models.Index(fields=['status']),
        ]

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

    @property
    def is_upcoming(self):
        from django.utils import timezone
        booking_datetime = timezone.make_aware(
            timezone.datetime.combine(self.date, self.time)
        )
        return booking_datetime > timezone.now() and self.status != BookingStatus.CANCELLED

    @property
    def is_past(self):
        from django.utils import timezone
        booking_datetime = timezone.make_aware(
            timezone.datetime.combine(self.date, self.time)
        )
        return booking_datetime < timezone.now() or self.status == BookingStatus.COMPLETED

    @property
    def can_cancel(self):
        return self.status in [BookingStatus.PENDING, BookingStatus.CONFIRMED]
