from django import forms
from django.core.exceptions import ValidationError
from .models import Reservation
from django.utils import timezone

class ReservationForm(forms.ModelForm):
    reservation_date = forms.DateTimeField(
        widget=forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}),
        input_formats=['%Y-%m-%dT%H:%M']
    )

    class Meta:
        model = Reservation
        fields = ['service', 'doctor', 'technician', 'reservation_date', 'notes', 'is_used']

    def __init__(self, *args, **kwargs):
        self.instance = kwargs.get('instance', None)
        super().__init__(*args, **kwargs)

    def clean_reservation_date(self):
        reservation_date = self.cleaned_data.get('reservation_date')
        
        if reservation_date < timezone.now():
            raise ValidationError('You cannot select a past date for reservation.')
        
        return reservation_date
    
    def clean(self):
        cleaned_data = super().clean()
        reservation_date = cleaned_data.get('reservation_date')
        doctor = cleaned_data.get('doctor')

        if self.instance and self.instance.pk:
            # Skip the availability check if the reservation date has not been changed
            if reservation_date == self.instance.reservation_date and doctor == self.instance.doctor:
                return cleaned_data

        if reservation_date and doctor:
            if not Reservation.is_slot_available(doctor, reservation_date):
                raise forms.ValidationError("This time slot is already booked.")
            
            # Verify the time is in 30-minute intervals
            if reservation_date.minute % 30 != 0:
                raise forms.ValidationError("Reservations must be made in 30-minute intervals.")

        return cleaned_data