from django import forms

from .models import Employee, Leave, Attendance, Payroll, Department, Deduction


class EmployeeForm(forms.ModelForm):
    class Meta:
        model = Employee
        fields = [
            'first_name', 'last_name', 'email', 'phone', 'address', 'national_id',
            'emergency_contact_name', 'emergency_contact_phone',
            'department', 'job_title', 'employment_type', 'employee_category', 'employment_status',
            'hire_date', 'salary', 'is_active',
            'bank', 'branch', 'account_number', 'profile_photo', 'id_scan_front',
            'id_scan_back', 'additional_documents'
        ]

        widgets = {
            'employment_type': forms.Select(attrs={'class': 'form-control'}),
            'employee_category': forms.Select(attrs={'class': 'form-control'}),
            'employment_status': forms.Select(attrs={'class': 'form-control'}),
            'hire_date': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'salary': forms.NumberInput(attrs={'class': 'form-control'}),
            'is_active': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
            'profile_photo': forms.ClearableFileInput(attrs={'class': 'form-control'}),
            'id_scan_front': forms.ClearableFileInput(attrs={'class': 'form-control'}),
            'id_scan_back': forms.ClearableFileInput(attrs={'class': 'form-control'}),
            'additional_documents': forms.ClearableFileInput(attrs={'class': 'form-control'}),
        }


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


class AttendanceForm(forms.ModelForm):
    class Meta:
        model = Attendance
        fields = ['employee', 'date', 'status']


class PayrollForm(forms.ModelForm):
    employee = forms.ModelChoiceField(queryset=Employee.objects.all(),
                                      widget=forms.Select(attrs={'class': 'form-control'}))

    class Meta:
        model = Payroll
        fields = ['employee', 'date', 'basic_salary', 'bonus', 'deductions']

        widgets = {
            'date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
            'basic_salary': forms.NumberInput(attrs={'class': 'form-control'}),
            'bonus': forms.NumberInput(attrs={'class': 'form-control'}),
            'deductions': forms.CheckboxSelectMultiple(),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if 'employee' in self.data:
            try:
                employee_id = int(self.data.get('employee'))
                self.fields['deductions'].queryset = Deduction.objects.filter(employee_id=employee_id)
                if hasattr(self, 'instance') and self.instance.employee:
                    self.fields['basic_salary'].initial = self.instance.employee.salary
            except (ValueError, TypeError):
                pass
        elif self.instance.pk and self.instance.employee:
            self.fields['deductions'].queryset = Deduction.objects.filter(employee=self.instance.employee)
            self.fields['basic_salary'].initial = self.instance.employee.salary


class DepartmentForm(forms.ModelForm):
    class Meta:
        model = Department
        fields = ['name']
        widgets = {
            'name': forms.TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'Enter department name',
                'required': True
            })
        }


class DeductionForm(forms.ModelForm):
    class Meta:
        model = Deduction
        fields = ['employee', 'reason', 'amount']
        widgets = {
            'employee': forms.Select(attrs={
                'class': 'form-control',
                'required': True
            }),
            'reason': forms.TextInput(attrs={
                'class': 'form-control',
                'placeholder': 'e.g., Late arrival, Uniform deduction',
                'required': True
            }),
            'amount': forms.NumberInput(attrs={
                'class': 'form-control',
                'step': '0.01',
                'min': '0.01',
                'placeholder': '0.00',
                'required': True
            })
        }
