
from django.contrib import admin
from django.contrib.auth.models import Group
from .models import Department, Employee, Deduction, Bonus, Payslip, EmployeeInvitation

@admin.register(Department)
class DepartmentAdmin(admin.ModelAdmin):
    list_display = ['name', 'manager', 'user_group', 'is_active', 'created_at']
    list_filter = ['is_active', 'created_at']
    search_fields = ['name', 'description']
    readonly_fields = ['created_at', 'updated_at']
    
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "user_group":
            kwargs["queryset"] = Group.objects.all()
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

@admin.register(Employee)
class EmployeeAdmin(admin.ModelAdmin):
    list_display = ['employee_id', 'full_name', 'department', 'job_title', 'employment_status', 'hire_date']
    list_filter = ['department', 'employment_type', 'employment_status', 'hire_date']
    search_fields = ['employee_id', 'first_name', 'last_name', 'email', 'id_number']
    readonly_fields = ['employee_id', 'created_at', 'updated_at']
    
    fieldsets = (
        ('Employee Information', {
            'fields': ('employee_id', 'user', 'first_name', 'last_name', 'email', 'phone')
        }),
        ('Identification', {
            'fields': ('id_number', 'kra_pin', 'nssf_number', 'nhif_number')
        }),
        ('Address', {
            'fields': ('physical_address', 'postal_address')
        }),
        ('Employment Details', {
            'fields': ('department', 'job_title', 'employment_type', 'employment_status')
        }),
        ('Important Dates', {
            'fields': ('hire_date', 'probation_end_date', 'termination_date')
        }),
        ('Salary & Banking', {
            'fields': ('basic_salary', 'bank_name', 'bank_account_number', 'bank_branch')
        }),
        ('Emergency Contact', {
            'fields': ('emergency_contact_name', 'emergency_contact_phone', 'emergency_contact_relationship')
        }),
        ('Additional Information', {
            'fields': ('profile_picture', 'notes')
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        })
    )

@admin.register(Deduction)
class DeductionAdmin(admin.ModelAdmin):
    list_display = ['employee', 'deduction_type', 'amount', 'is_recurring', 'is_active', 'start_date']
    list_filter = ['deduction_type', 'is_recurring', 'is_active', 'start_date']
    search_fields = ['employee__first_name', 'employee__last_name', 'employee__employee_id', 'reason']
    readonly_fields = ['created_at', 'updated_at']
    
    def save_model(self, request, obj, form, change):
        if not change:  # If creating new object
            obj.created_by = request.user
        super().save_model(request, obj, form, change)

@admin.register(Bonus)
class BonusAdmin(admin.ModelAdmin):
    list_display = ['employee', 'bonus_type', 'amount', 'is_recurring', 'is_active', 'date_earned']
    list_filter = ['bonus_type', 'is_recurring', 'is_active', 'date_earned']
    search_fields = ['employee__first_name', 'employee__last_name', 'employee__employee_id', 'reason']
    readonly_fields = ['created_at', 'updated_at']
    
    def save_model(self, request, obj, form, change):
        if not change:  # If creating new object
            obj.created_by = request.user
        super().save_model(request, obj, form, change)

@admin.register(Payslip)
class PayslipAdmin(admin.ModelAdmin):
    list_display = ['payslip_number', 'employee', 'pay_period_start', 'pay_period_end', 'net_salary', 'is_paid']
    list_filter = ['is_generated', 'is_paid', 'pay_date', 'pay_period_start']
    search_fields = ['payslip_number', 'employee__first_name', 'employee__last_name', 'employee__employee_id']
    readonly_fields = ['payslip_number', 'gross_salary', 'net_salary', 'created_at', 'updated_at']
    
    fieldsets = (
        ('Payslip Information', {
            'fields': ('payslip_number', 'employee', 'generated_by')
        }),
        ('Pay Period', {
            'fields': ('pay_period_start', 'pay_period_end', 'pay_date')
        }),
        ('Salary Components', {
            'fields': ('basic_salary', 'total_bonuses', 'gross_salary')
        }),
        ('Deductions', {
            'fields': ('total_deductions', 'paye_tax', 'nhif_deduction', 'nssf_deduction')
        }),
        ('Final Amount', {
            'fields': ('net_salary',)
        }),
        ('Status', {
            'fields': ('is_generated', 'is_paid', 'notes')
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        })
    )
    
    def save_model(self, request, obj, form, change):
        if not change:  # If creating new object
            obj.generated_by = request.user
        super().save_model(request, obj, form, change)

@admin.register(EmployeeInvitation)
class EmployeeInvitationAdmin(admin.ModelAdmin):
    list_display = ['employee', 'is_used', 'is_expired', 'created_at', 'expires_at']
    list_filter = ['is_used', 'created_at']
    search_fields = ['employee__first_name', 'employee__last_name', 'employee__email']
    readonly_fields = ['token', 'created_at', 'used_at']
