from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from .models import Employee, Company
from wtlms.admin import admin_site

@admin.register(Company, site=admin_site)
class CompanyAdmin(admin.ModelAdmin):
    list_display = ('name', 'contact_email', 'contact_phone', 'address')
    search_fields = ('name', 'contact_email')

class EmployeeInline(admin.StackedInline):
    model = Employee
    can_delete = False
    verbose_name_plural = 'Employee Details'
    fields = ('role', 'department', 'basic_pay', 'annual_leave_days', 'accumulated_leave_days')

class CustomUserAdmin(UserAdmin):
    inlines = (EmployeeInline,)
    list_display = ('username', 'email', 'first_name', 'last_name', 'get_department', 'get_role', 'get_basic_pay')
    list_filter = ('employee__role',)
    search_fields = ('username', 'first_name', 'last_name', 'email', 'employee__role', 'employee__department')
    ordering = ('username',)

    def get_department(self, obj):
        if hasattr(obj, 'employee'):
            return obj.employee.department or '-'
        return '-'
    get_department.short_description = 'Department'
    get_department.admin_order_field = 'employee__department'

    def get_role(self, obj):
        if hasattr(obj, 'employee'):
            return obj.employee.get_role_display()
        return '-'
    get_role.short_description = 'Role'
    get_role.admin_order_field = 'employee__role'

    def get_basic_pay(self, obj):
        if hasattr(obj, 'employee'):
            return f'K{obj.employee.basic_pay:,.2f}'
        return '-'
    get_basic_pay.short_description = 'Basic Pay'
    get_basic_pay.admin_order_field = 'employee__basic_pay'

    def get_inline_instances(self, request, obj=None):
        if not obj:
            return []
        return super().get_inline_instances(request, obj)

@admin.register(Employee, site=admin_site)
class EmployeeAdmin(admin.ModelAdmin):
    list_display = ('user', 'company', 'department', 'role', 'basic_pay', 'annual_leave_days', 'accumulated_leave_days')
    list_filter = ('role', 'company', 'department')
    search_fields = ('user__username', 'user__first_name', 'user__last_name', 'role', 'company__name', 'department')
    ordering = ('user__username',)
    readonly_fields = ('accumulated_leave_days',)
    
    fieldsets = (
        ('Employee Information', {
            'fields': ('user', 'company', 'role')
        }),
        ('Compensation', {
            'fields': ('basic_pay',)
        }),
        ('Leave Details', {
            'fields': ('annual_leave_days', 'accumulated_leave_days')
        }),
    )

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        # Only show active employees
        return qs.filter(user__is_active=True)

    def save_model(self, request, obj, form, change):
        if not change:  # Only for new employees
            # Set default values
            obj.annual_leave_days = 24  # Default annual leave days
            obj.accumulated_leave_days = 0
        super().save_model(request, obj, form, change)

# Register User model with custom admin site
admin_site.register(User, CustomUserAdmin)
