"""Assignment Engine selectors — read-only queries."""

from __future__ import annotations

from django.db.models import Q, QuerySet

from simorgh.apps.assignments.models import Assignment, AssignmentTag


def tags_for_tenant(tenant_id: int) -> QuerySet[AssignmentTag]:
    return AssignmentTag.objects.filter(tenant_id=tenant_id).order_by("name")


def assignments_for_tenant(tenant_id: int) -> QuerySet[Assignment]:
    return Assignment.objects.filter(tenant_id=tenant_id)


def assignments_my(tenant_id: int, user_id: int) -> QuerySet[Assignment]:
    """Active assignments for a user, ordered by due date then priority."""
    return (
        assignments_for_tenant(tenant_id)
        .filter(assigned_to_id=user_id)
        .exclude(status__in=("completed", "cancelled"))
        .order_by("due_date", "-priority")
    )


def assignments_inbox(tenant_id: int, user_id: int) -> QuerySet[Assignment]:
    """All assignments (active + completed) for a user."""
    return (
        assignments_for_tenant(tenant_id)
        .filter(assigned_to_id=user_id)
        .order_by("-created_at")
    )


def assignments_sent(tenant_id: int, user_id: int) -> QuerySet[Assignment]:
    """Assignments created by a user."""
    return (
        assignments_for_tenant(tenant_id)
        .filter(assigned_by_id=user_id)
        .order_by("-created_at")
    )


def assignments_overdue(tenant_id: int, user_id: int | None = None) -> QuerySet[Assignment]:
    """Overdue assignments, optionally filtered by user."""
    from django.utils import timezone
    qs = (
        assignments_for_tenant(tenant_id)
        .filter(due_date__lt=timezone.now())
        .exclude(status__in=("completed", "cancelled"))
    )
    if user_id is not None:
        qs = qs.filter(assigned_to_id=user_id)
    return qs.order_by("due_date")


def assignment_by_public_id(tenant_id: int, public_id: str) -> Assignment:
    return Assignment.objects.get(tenant_id=tenant_id, public_id=public_id)


def assignments_for_entity(tenant_id: int, content_type_id: int, object_id: int) -> QuerySet[Assignment]:
    return (
        assignments_for_tenant(tenant_id)
        .filter(content_type_id=content_type_id, object_id=object_id)
        .order_by("-created_at")
    )


def search_assignments(tenant_id: int, query: str) -> QuerySet[Assignment]:
    return (
        assignments_for_tenant(tenant_id)
        .filter(
            Q(title__icontains=query)
            | Q(description__icontains=query)
        )
        .distinct()
    )
