from django import forms
from .models import LeaveRequest

class LeaveRequestForm(forms.ModelForm):
    class Meta:
        model = LeaveRequest
        fields = ['leave_type', 'start_date', 'end_date', 'reason']
        widgets = {
            'start_date': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'end_date': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'leave_type': forms.Select(attrs={'class': 'form-control'}),
            'reason': forms.Textarea(attrs={'rows': 3, 'class': 'form-control'}),
        }

    def clean(self):
        cleaned_data = super().clean()
        start_date = cleaned_data.get('start_date')
        end_date = cleaned_data.get('end_date')
        leave_type = cleaned_data.get('leave_type')

        if start_date and end_date:
            # Ensure end date is not before start date
            if end_date < start_date:
                raise forms.ValidationError("End date cannot be before start date")

            # Check if employee has enough annual leave days
            if leave_type == 'ANN':
                employee = self.instance.employee if self.instance.pk else None
                if employee:
                    days_requested = (end_date - start_date).days + 1
                    available_days = employee.annual_leave_days + employee.accumulated_leave_days
                    
                    if days_requested > available_days:
                        raise forms.ValidationError(
                            f"You only have {available_days} leave days available"
                        )

            # Check for overlapping leave requests
            employee = self.instance.employee if self.instance.pk else None
            if employee:
                overlapping = LeaveRequest.objects.filter(
                    employee=employee,
                    status__in=['PENDING', 'HR_APPROVED', 'REG_APPROVED']
                ).exclude(pk=self.instance.pk if self.instance.pk else None)

                for request in overlapping:
                    if (start_date <= request.end_date and 
                        end_date >= request.start_date):
                        raise forms.ValidationError(
                            "You already have a leave request for this period"
                        )

        return cleaned_data
