from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models

from bookings.models import Booking
from structures.models import Structure


class Service(models.Model):
    structure = models.ForeignKey(
        Structure,
        on_delete=models.CASCADE,
        related_name="services",
    )
    name = models.CharField(max_length=255)
    default_price = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        validators=[MinValueValidator(0)],
        help_text="Gross price including VAT.",
    )
    vat_rate = models.DecimalField(
        max_digits=5,
        decimal_places=2,
        validators=[MinValueValidator(0), MaxValueValidator(100)],
        help_text="VAT rate applied to the gross service price.",
    )
    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 = "services"
        ordering = ["name", "id"]
        constraints = [
            models.UniqueConstraint(
                fields=["structure", "name"],
                name="uniq_service_name_per_structure",
            ),
        ]

    def __str__(self):
        return f"{self.name} ({self.structure_id})"


class BookingService(models.Model):
    booking = models.ForeignKey(
        Booking,
        on_delete=models.CASCADE,
        related_name="booking_services",
    )
    service = models.ForeignKey(
        Service,
        on_delete=models.PROTECT,
        related_name="booking_services",
    )
    price = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        validators=[MinValueValidator(0)],
        help_text="Gross price snapshot captured on booking selection.",
    )
    vat_rate = models.DecimalField(
        max_digits=5,
        decimal_places=2,
        validators=[MinValueValidator(0), MaxValueValidator(100)],
        help_text="VAT rate snapshot captured on booking selection.",
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "booking_services"
        ordering = ["id"]
        constraints = [
            models.UniqueConstraint(
                fields=["booking", "service"],
                name="uniq_service_per_booking",
            ),
        ]

    def __str__(self):
        return f"Booking {self.booking_id} -> Service {self.service_id}"
