from django.contrib import admin
from .models import LeaveRequest
from wtlms.admin import admin_site

# Register your models here.

@admin.register(LeaveRequest, site=admin_site)
class LeaveRequestAdmin(admin.ModelAdmin):
    list_display = ('employee', 'leave_type', 'start_date', 'end_date', 'status', 'days_requested')
    list_filter = ('status', 'leave_type')
    search_fields = ('employee__user__username', 'employee__user__first_name', 'employee__user__last_name')
    ordering = ('-start_date',)
    readonly_fields = ('days_requested',)
    
    fieldsets = (
        ('Employee Information', {
            'fields': ('employee',)
        }),
        ('Leave Details', {
            'fields': ('leave_type', 'start_date', 'end_date', 'days_requested')
        }),
        ('Status', {
            'fields': ('status',)
        }),
        ('Comments', {
            'fields': ('reason', 'hr_comment', 'registrar_comment')
        }),
    )

    def days_requested(self, obj):
        if obj.start_date and obj.end_date:
            days = (obj.end_date - obj.start_date).days + 1
            return f"{days} day{'s' if days != 1 else ''}"
        return '-'
    days_requested.short_description = 'Days'

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if hasattr(request.user, 'employee'):
            role = request.user.employee.role
            if role == 'HR':
                # HR sees all requests
                return qs
            elif role == 'REG':
                # Registrar sees HR approved requests
                return qs.filter(status='HR_APPROVED')
        return qs.none()  # Other roles don't see anything in admin

    def has_change_permission(self, request, obj=None):
        if not obj or not hasattr(request.user, 'employee'):
            return False
        role = request.user.employee.role
        if role == 'HR':
            # HR can only change pending requests
            return obj.status == 'PENDING_HR'
        elif role == 'REG':
            # Registrar can only change HR approved requests
            return obj.status == 'HR_APPROVED'
        return False

    def has_delete_permission(self, request, obj=None):
        if not obj or not hasattr(request.user, 'employee'):
            return False
        # Only HR can delete pending requests
        return request.user.employee.role == 'HR' and obj.status == 'PENDING_HR'

    def has_add_permission(self, request):
        # Leave requests should be created through the frontend
        return False

    def save_model(self, request, obj, form, change):
        if change and hasattr(request.user, 'employee'):
            role = request.user.employee.role
            if role == 'HR' and 'status' in form.changed_data:
                if obj.status == 'HR_APPROVED':
                    obj.hr_comment = f'Approved by {request.user.get_full_name()}'
                elif obj.status == 'REJECTED':
                    obj.hr_comment = f'Rejected by {request.user.get_full_name()}'
            elif role == 'REG' and 'status' in form.changed_data:
                if obj.status == 'APPROVED':
                    obj.registrar_comment = f'Approved by {request.user.get_full_name()}'
                elif obj.status == 'REJECTED':
                    obj.registrar_comment = f'Rejected by {request.user.get_full_name()}'
        super().save_model(request, obj, form, change)
