from django import forms
from django.contrib.auth.models import Group
from .models import Employee, Department, Deduction, Bonus, EmployeeDocument, Attendance

class EmployeeForm(forms.ModelForm):
    class Meta:
        model = Employee
        fields = [
            'first_name', 'last_name', 'email', 'phone',
            'id_number', 'kra_pin', 'nssf_number', 'nhif_number',
            'physical_address', 'postal_address',
            'department', 'job_title', 'employment_type', 'employment_status',
            'hire_date', 'probation_end_date', 'termination_date',
            'basic_salary', 'pay_frequency', 'daily_rate', 'hourly_rate',
            'contract_start_date', 'contract_end_date',
            'bank_name', 'bank_account_number', 'bank_branch',
            'emergency_contact_name', 'emergency_contact_phone', 'emergency_contact_relationship',
            'profile_picture', 'notes'
        ]
        widgets = {
            'first_name': forms.TextInput(attrs={'class': 'form-control'}),
            'last_name': forms.TextInput(attrs={'class': 'form-control'}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
            'phone': forms.TextInput(attrs={'class': 'form-control'}),
            'id_number': forms.TextInput(attrs={'class': 'form-control'}),
            'kra_pin': forms.TextInput(attrs={'class': 'form-control'}),
            'nssf_number': forms.TextInput(attrs={'class': 'form-control'}),
            'nhif_number': forms.TextInput(attrs={'class': 'form-control'}),
            'physical_address': forms.Textarea(attrs={'rows': 3, 'class': 'form-control'}),
            'postal_address': forms.Textarea(attrs={'rows': 3, 'class': 'form-control'}),
            'department': forms.Select(attrs={'class': 'form-select'}),
            'job_title': forms.TextInput(attrs={'class': 'form-control'}),
            'employment_type': forms.Select(attrs={'class': 'form-select'}),
            'employment_status': forms.Select(attrs={'class': 'form-select'}),
            'hire_date': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'probation_end_date': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'termination_date': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'basic_salary': forms.NumberInput(attrs={'step': '0.01', 'class': 'form-control'}),
            'pay_frequency': forms.Select(attrs={'class': 'form-select'}),
            'daily_rate': forms.NumberInput(attrs={'step': '0.01', 'class': 'form-control'}),
            'hourly_rate': forms.NumberInput(attrs={'step': '0.01', 'class': 'form-control'}),
            'contract_start_date': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'contract_end_date': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'bank_name': forms.TextInput(attrs={'class': 'form-control'}),
            'bank_account_number': forms.TextInput(attrs={'class': 'form-control'}),
            'bank_branch': forms.TextInput(attrs={'class': 'form-control'}),
            'emergency_contact_name': forms.TextInput(attrs={'class': 'form-control'}),
            'emergency_contact_phone': forms.TextInput(attrs={'class': 'form-control'}),
            'emergency_contact_relationship': forms.TextInput(attrs={'class': 'form-control'}),
            'profile_picture': forms.FileInput(attrs={'class': 'form-control', 'accept': 'image/*'}),
            'notes': forms.Textarea(attrs={'rows': 4, 'class': 'form-control'}),
        }

class DepartmentForm(forms.ModelForm):
    class Meta:
        model = Department
        fields = ['name', 'description', 'manager', 'user_group', 'is_active']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control'}),
            'description': forms.Textarea(attrs={'class': 'form-control', 'rows': 4}),
            'manager': forms.Select(attrs={'class': 'form-select'}),
            'user_group': forms.Select(attrs={'class': 'form-select'}),
            'is_active': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['manager'].queryset = Employee.objects.filter(employment_status='active')
        self.fields['user_group'].queryset = Group.objects.all()
        self.fields['manager'].required = False
        self.fields['user_group'].required = False

class DeductionForm(forms.ModelForm):
    class Meta:
        model = Deduction
        fields = [
            'employee', 'deduction_type', 'reason', 'amount', 'is_recurring',
            'start_date', 'end_date', 'is_active'
        ]
        widgets = {
            'employee': forms.Select(attrs={'class': 'form-select'}),
            'deduction_type': forms.Select(attrs={'class': 'form-select'}),
            'reason': forms.TextInput(attrs={'class': 'form-control'}),
            'amount': forms.NumberInput(attrs={'step': '0.01', 'class': 'form-control'}),
            'is_recurring': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
            'start_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
            'end_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
            'is_active': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['employee'].queryset = Employee.objects.filter(employment_status='active')
        self.fields['end_date'].required = False

class BonusForm(forms.ModelForm):
    class Meta:
        model = Bonus
        fields = [
            'employee', 'bonus_type', 'reason', 'amount', 'is_recurring',
            'date_earned', 'is_active'
        ]
        widgets = {
            'employee': forms.Select(attrs={'class': 'form-select'}),
            'bonus_type': forms.Select(attrs={'class': 'form-select'}),
            'reason': forms.TextInput(attrs={'class': 'form-control'}),
            'amount': forms.NumberInput(attrs={'step': '0.01', 'class': 'form-control'}),
            'is_recurring': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
            'date_earned': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
            'is_active': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['employee'].queryset = Employee.objects.filter(employment_status='active')

class EmployeeDocumentForm(forms.ModelForm):
    class Meta:
        model = EmployeeDocument
        fields = ['employee', 'document_type', 'title', 'document_file', 'notes']
        widgets = {
            'employee': forms.Select(attrs={'class': 'form-select'}),
            'document_type': forms.Select(attrs={'class': 'form-select'}),
            'title': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Enter document title or description'}),
            'document_file': forms.FileInput(attrs={'class': 'form-control', 'accept': '.pdf,.doc,.docx,.jpg,.jpeg,.png'}),
            'notes': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}),
        }

    def __init__(self, *args, **kwargs):
        employee = kwargs.pop('employee', None)
        super().__init__(*args, **kwargs)

        if employee:
            self.fields['employee'].initial = employee
            self.fields['employee'].widget = forms.HiddenInput()
        else:
            self.fields['employee'].queryset = Employee.objects.filter(employment_status='active')

class EmployeeAccountSetupForm(forms.Form):
    password = forms.CharField(
        min_length=8,
        widget=forms.PasswordInput(attrs={
            'class': 'form-control',
            'placeholder': 'Create a password (minimum 8 characters)'
        }),
        help_text="Password must be at least 8 characters long."
    )
    confirm_password = forms.CharField(
        widget=forms.PasswordInput(attrs={
            'class': 'form-control',
            'placeholder': 'Confirm your password'
        })
    )

    def clean(self):
        cleaned_data = super().clean()
        password = cleaned_data.get('password')
        confirm_password = cleaned_data.get('confirm_password')

        if password and confirm_password:
            if password != confirm_password:
                raise forms.ValidationError("Passwords don't match.")

        return cleaned_data

class CreateUserAccountForm(forms.Form):
    """Form for creating a user account for an employee with temporary password"""
    generate_password = forms.BooleanField(
        initial=True,
        required=False,
        widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}),
        help_text="Check to auto-generate a temporary password"
    )
    custom_password = forms.CharField(
        required=False,
        min_length=8,
        widget=forms.PasswordInput(attrs={
            'class': 'form-control',
            'placeholder': 'Enter custom password (optional)'
        }),
        help_text="Leave blank to auto-generate password"
    )
    send_email = forms.BooleanField(
        initial=True,
        required=False,
        widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}),
        help_text="Send login credentials via email"
    )

    def clean(self):
        cleaned_data = super().clean()
        generate_password = cleaned_data.get('generate_password')
        custom_password = cleaned_data.get('custom_password')

        if not generate_password and not custom_password:
            raise forms.ValidationError("Either enable auto-generate password or provide a custom password.")

        if custom_password and len(custom_password) < 8:
            raise forms.ValidationError("Custom password must be at least 8 characters long.")

        return cleaned_data

class ResetUserPasswordForm(forms.Form):
    """Form for resetting an employee's user account password"""
    generate_new_password = forms.BooleanField(
        initial=True,
        required=False,
        widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}),
        help_text="Check to auto-generate a new temporary password"
    )
    custom_reset_password = forms.CharField(
        required=False,
        min_length=8,
        widget=forms.PasswordInput(attrs={
            'class': 'form-control',
            'placeholder': 'Enter new password (optional)'
        }),
        help_text="Leave blank to auto-generate password"
    )
    send_reset_email = forms.BooleanField(
        initial=True,
        required=False,
        widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}),
        help_text="Send new password via email"
    )

    def clean(self):
        cleaned_data = super().clean()
        generate_new_password = cleaned_data.get('generate_new_password')
        custom_reset_password = cleaned_data.get('custom_reset_password')

        if not generate_new_password and not custom_reset_password:
            raise forms.ValidationError("Either enable auto-generate password or provide a custom password.")

        if custom_reset_password and len(custom_reset_password) < 8:
            raise forms.ValidationError("Custom password must be at least 8 characters long.")

        return cleaned_data

class AttendanceForm(forms.ModelForm):
    class Meta:
        model = Attendance
        fields = [
            'employee', 'date', 'status', 'check_in_time', 'check_out_time',
            'hours_worked', 'overtime_hours', 'notes'
        ]
        widgets = {
            'date': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}),
            'check_in_time': forms.TimeInput(attrs={'type': 'time', 'class': 'form-control'}),
            'check_out_time': forms.TimeInput(attrs={'type': 'time', 'class': 'form-control'}),
            'hours_worked': forms.NumberInput(attrs={'step': '0.25', 'class': 'form-control'}),
            'overtime_hours': forms.NumberInput(attrs={'step': '0.25', 'class': 'form-control'}),
            'notes': forms.Textarea(attrs={'rows': 2, 'class': 'form-control'}),
        }

class BulkAttendanceForm(forms.Form):
    date = forms.DateField(widget=forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}))
    employees = forms.ModelMultipleChoiceField(
        queryset=Employee.objects.filter(employment_status='active'),
        widget=forms.CheckboxSelectMultiple,
        required=False
    )
    status = forms.ChoiceField(choices=Attendance.STATUS_CHOICES, widget=forms.Select(attrs={'class': 'form-control'}))