from django import forms
from django.forms import inlineformset_factory, TextInput, DateInput
from .models import Expense, Doctor, Technician, ExpenseDoctor, ExpenseTechnician, ExpenseOtherCost

from django import forms
from .models import ExpenseItem


class ExpenseItemForm(forms.ModelForm):
    """Form for expense items with proper validation"""

    class Meta:
        model = ExpenseItem
        fields = [
            'date', 'description', 'cost_dollar', 'currency_type',
            'expense_type', 'doctor', 'technician'
        ]
        widgets = {
            'date': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'description': forms.TextInput(attrs={'class': 'form-control'}),
            'cost_dollar': forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'}),
            'currency_type': forms.Select(attrs={'class': 'form-select'}),
            'expense_type': forms.Select(attrs={'class': 'form-select'}),
            'doctor': forms.Select(attrs={'class': 'form-select'}),
            'technician': forms.Select(attrs={'class': 'form-select'}),
        }

    def clean(self):
        cleaned_data = super().clean()
        expense_type = cleaned_data.get('expense_type')
        doctor = cleaned_data.get('doctor')
        technician = cleaned_data.get('technician')

        if expense_type == 'doctor' and not doctor:
            raise forms.ValidationError("Doctor must be selected for doctor expenses")

        if expense_type == 'technician' and not technician:
            raise forms.ValidationError("Technician must be selected for technician expenses")

        return cleaned_data

class ExpenseForm(forms.ModelForm):
    date = forms.DateField(widget=DateInput(attrs={'type': 'date'}))

    class Meta:
        model = Expense
        fields = ['date', 'fixed_cost_dollar']
        widgets = {
            'fixed_cost_dollar': TextInput(attrs={'placeholder': 'Fixed cost in dollars'}),

        }

class ExpenseDoctorForm(forms.ModelForm):
    doctor = forms.ModelChoiceField(queryset=Doctor.objects.all(), widget=forms.Select(attrs={'placeholder': 'Select a doctor'}))
    cost_dollar = forms.DecimalField(widget=TextInput(attrs={'placeholder': 'Doctor cost in dollars'}))


    class Meta:
        model = ExpenseDoctor
        fields = ['doctor', 'cost_dollar']

class ExpenseTechnicianForm(forms.ModelForm):
    technician = forms.ModelChoiceField(queryset=Technician.objects.all(), widget=forms.Select(attrs={'placeholder': 'Select a technician'}))
    cost_dollar = forms.DecimalField(widget=TextInput(attrs={'placeholder': 'Technician cost in dollars'}))


    class Meta:
        model = ExpenseTechnician
        fields = ['technician', 'cost_dollar']

class ExpenseOtherCostForm(forms.ModelForm):
    description = forms.CharField(widget=TextInput(attrs={'placeholder': 'Description'}), required=False)
    cost_dollar = forms.DecimalField(widget=TextInput(attrs={'placeholder': ' Other cost in dollars'}))

    class Meta:
        model = ExpenseOtherCost
        fields = ['description', 'cost_dollar']

# Formsets
ExpenseDoctorFormSet = inlineformset_factory(Expense, ExpenseDoctor, form=ExpenseDoctorForm, extra=2, can_delete=True)
ExpenseTechnicianFormSet = inlineformset_factory(Expense, ExpenseTechnician, form=ExpenseTechnicianForm,extra=2, can_delete=True)
ExpenseOtherCostFormSet = inlineformset_factory(Expense, ExpenseOtherCost, form=ExpenseOtherCostForm, extra=2,  can_delete=True)
