"""HR admin registrations."""

from __future__ import annotations

from django.contrib import admin

from simorgh.apps.hr_core.models import (
    Employee,
    EmployeeBankAccount,
    EmployeeDocument,
    JobTitle,
    LeaveBalance,
    LeaveRequest,
    LeaveType,
    PublicHoliday,
)


@admin.register(JobTitle)
class JobTitleAdmin(admin.ModelAdmin):
    list_display = ("title", "level", "department", "tenant")
    list_filter = ("tenant", "level")
    search_fields = ("title",)


class EmployeeDocumentInline(admin.TabularInline):
    model = EmployeeDocument
    extra = 0
    fields = ("doc_type", "title", "dms_file_id", "expiry_date", "is_verified")


class EmployeeBankAccountInline(admin.TabularInline):
    model = EmployeeBankAccount
    extra = 0
    fields = ("bank_name", "is_default")
    readonly_fields = ("account_no", "iban")


@admin.register(Employee)
class EmployeeAdmin(admin.ModelAdmin):
    list_display = (
        "employee_no",
        "display_name",
        "employment_type",
        "status",
        "department",
        "job_title",
        "hire_date",
    )
    list_filter = ("tenant", "status", "employment_type")
    search_fields = ("employee_no", "first_name", "last_name", "display_name", "work_email")
    readonly_fields = ("public_id", "employee_no", "national_id")
    fieldsets = (
        (
            "Identity",
            {
                "fields": (
                    "public_id",
                    "user",
                    "employee_no",
                    "first_name",
                    "last_name",
                    "display_name",
                    "national_id",
                    "birth_date",
                    "gender",
                )
            },
        ),
        (
            "Contact",
            {"fields": ("mobile", "personal_email", "work_email")},
        ),
        (
            "Employment",
            {
                "fields": (
                    "employment_type",
                    "hire_date",
                    "termination_date",
                    "status",
                    "department",
                    "manager",
                    "job_title",
                    "work_location",
                    "tenant",
                    "organization_node",
                )
            },
        ),
    )
    inlines = [EmployeeDocumentInline, EmployeeBankAccountInline]


# ---------------------------------------------------------------------------
# Leave (S4.2)
# ---------------------------------------------------------------------------

@admin.register(LeaveType)
class LeaveTypeAdmin(admin.ModelAdmin):
    list_display = ("name", "code", "is_paid", "requires_approval", "max_days_per_year", "tenant")
    list_filter = ("tenant", "is_paid", "requires_approval")
    search_fields = ("name", "code")


@admin.register(PublicHoliday)
class PublicHolidayAdmin(admin.ModelAdmin):
    list_display = ("name", "date", "calendar_type", "is_recurring", "tenant")
    list_filter = ("tenant", "calendar_type")
    search_fields = ("name",)


@admin.register(LeaveBalance)
class LeaveBalanceAdmin(admin.ModelAdmin):
    list_display = ("employee", "leave_type", "year", "allocated", "used", "pending")
    list_filter = ("year", "leave_type")
    search_fields = ("employee__first_name", "employee__last_name")


@admin.register(LeaveRequest)
class LeaveRequestAdmin(admin.ModelAdmin):
    list_display = ("employee", "leave_type", "from_date", "to_date", "days_requested", "status")
    list_filter = ("status", "leave_type", "tenant")
    search_fields = ("employee__first_name", "employee__last_name")
    readonly_fields = ("public_id", "submitted_at", "reviewed_at")


# ── Attendance (S4.3) ─────────────────────────────────────────────────────────

from simorgh.apps.hr_core.models import AttendanceRecord, EmployeeShift, ShiftDefinition  # noqa: E402


@admin.register(ShiftDefinition)
class ShiftDefinitionAdmin(admin.ModelAdmin):
    list_display = ("name", "tenant", "start_time", "end_time", "break_minutes")
    list_filter = ("tenant",)
    search_fields = ("name",)


@admin.register(EmployeeShift)
class EmployeeShiftAdmin(admin.ModelAdmin):
    list_display = ("employee", "shift", "effective_from", "effective_to")
    list_filter = ("shift",)
    search_fields = ("employee__first_name", "employee__last_name")


@admin.register(AttendanceRecord)
class AttendanceRecordAdmin(admin.ModelAdmin):
    list_display = ("employee", "date", "check_in", "check_out", "work_minutes", "overtime_minutes", "source", "is_finalized")
    list_filter = ("tenant", "source", "is_finalized")
    search_fields = ("employee__first_name", "employee__last_name")
    readonly_fields = ("public_id", "work_minutes", "overtime_minutes")
