"""Tasks selectors — read-only queries."""

from __future__ import annotations

from django.db.models import Q, QuerySet

from simorgh.apps.tasks.models import Task, TaskComment, TaskTag, TaskWatcher


# ---------------------------------------------------------------------------
# Tasks
# ---------------------------------------------------------------------------

def tasks_for_tenant(tenant_id: int) -> QuerySet[Task]:
    return Task.objects.filter(tenant_id=tenant_id)


def tasks_for_project(tenant_id: int, project_id: int) -> QuerySet[Task]:
    return tasks_for_tenant(tenant_id).filter(project_id=project_id)


def tasks_for_assignee(tenant_id: int, user_id: int) -> QuerySet[Task]:
    return tasks_for_tenant(tenant_id).filter(assignee_id=user_id)


def tasks_my(tenant_id: int, user_id: int) -> QuerySet[Task]:
    """Tasks assigned to a specific user across all projects."""
    return tasks_for_tenant(tenant_id).filter(assignee_id=user_id).exclude(
        status__in=("done", "cancelled")
    ).order_by("due_date", "priority")


def subtasks_for_task(task_id: int) -> QuerySet[Task]:
    return Task.objects.filter(parent_id=task_id)


def task_by_public_id(tenant_id: int, public_id: str) -> Task:
    return Task.objects.get(tenant_id=tenant_id, public_id=public_id)


def search_tasks(tenant_id: int, query: str) -> QuerySet[Task]:
    return tasks_for_tenant(tenant_id).filter(
        Q(title__icontains=query)
        | Q(description__icontains=query)
    ).distinct()


# ---------------------------------------------------------------------------
# Tags
# ---------------------------------------------------------------------------

def tags_for_tenant(tenant_id: int) -> QuerySet[TaskTag]:
    return TaskTag.objects.filter(tenant_id=tenant_id).order_by("name")


# ---------------------------------------------------------------------------
# Comments
# ---------------------------------------------------------------------------

def comments_for_task(task_id: int) -> QuerySet[TaskComment]:
    return TaskComment.objects.filter(task_id=task_id).select_related("author").order_by("created_at")


# ---------------------------------------------------------------------------
# Watchers
# ---------------------------------------------------------------------------

def watchers_for_task(task_id: int) -> QuerySet[TaskWatcher]:
    return TaskWatcher.objects.filter(task_id=task_id).select_related("user")


def is_watching(task_id: int, user_id: int) -> bool:
    return TaskWatcher.objects.filter(task_id=task_id, user_id=user_id).exists()
