from __future__ import annotations

from typing import TYPE_CHECKING

from django.db.models import QuerySet

if TYPE_CHECKING:
    from simorgh.apps.hr_core.models import LeaveRequest


def leave_types_for_tenant(tenant_id: int) -> QuerySet:
    from simorgh.apps.hr_core.models import LeaveType
    return LeaveType.objects.filter(tenant_id=tenant_id).order_by("name")


def leave_type_by_id(tenant_id: int, pk: int):
    from simorgh.apps.hr_core.models import LeaveType
    return LeaveType.objects.filter(tenant_id=tenant_id, pk=pk).first()


def public_holidays_for_tenant(tenant_id: int, year: int | None = None) -> QuerySet:
    from simorgh.apps.hr_core.models import PublicHoliday
    qs = PublicHoliday.objects.filter(tenant_id=tenant_id)
    if year:
        qs = qs.filter(date__year=year)
    return qs.order_by("date")


def leave_balances(
    tenant_id: int,
    *,
    employee_id: int | None = None,
    year: int | None = None,
    leave_type_id: int | None = None,
) -> QuerySet:
    from simorgh.apps.hr_core.models import LeaveBalance
    qs = LeaveBalance.objects.filter(tenant_id=tenant_id).select_related(
        "leave_type", "employee"
    )
    if employee_id:
        qs = qs.filter(employee_id=employee_id)
    if year:
        qs = qs.filter(year=year)
    if leave_type_id:
        qs = qs.filter(leave_type_id=leave_type_id)
    return qs.order_by("-year", "leave_type__name")


def leave_requests(
    tenant_id: int,
    *,
    employee_id: int | None = None,
    leave_type_id: int | None = None,
    status: str | None = None,
    from_date=None,
    to_date=None,
) -> QuerySet:
    from simorgh.apps.hr_core.models import LeaveRequest
    qs = LeaveRequest.objects.filter(tenant_id=tenant_id).select_related(
        "employee", "leave_type", "reviewed_by"
    )
    if employee_id:
        qs = qs.filter(employee_id=employee_id)
    if leave_type_id:
        qs = qs.filter(leave_type_id=leave_type_id)
    if status:
        qs = qs.filter(status=status)
    if from_date:
        qs = qs.filter(to_date__gte=from_date)
    if to_date:
        qs = qs.filter(from_date__lte=to_date)
    return qs.order_by("-created_at")


def leave_request_by_public_id(tenant_id: int, public_id) -> "LeaveRequest | None":
    from simorgh.apps.hr_core.models import LeaveRequest
    return LeaveRequest.objects.filter(
        tenant_id=tenant_id, public_id=public_id
    ).select_related("employee", "leave_type", "reviewed_by").first()


def leave_calendar(tenant_id: int, *, from_date, to_date, department_id=None) -> QuerySet:
    from simorgh.apps.hr_core.models import LeaveRequest, LeaveRequestStatus
    qs = LeaveRequest.objects.filter(
        tenant_id=tenant_id,
        status=LeaveRequestStatus.APPROVED,
        from_date__lte=to_date,
        to_date__gte=from_date,
    ).select_related("employee", "leave_type")
    if department_id:
        qs = qs.filter(employee__department_id=department_id)
    return qs.order_by("from_date")
