"""Projects selectors — read-only queries."""

from __future__ import annotations

from django.db.models import Q, QuerySet

from simorgh.apps.projects.models import (
    Milestone,
    Project,
    ProjectMember,
    ProjectPhase,
    ProjectTag,
)


# ---------------------------------------------------------------------------
# Projects
# ---------------------------------------------------------------------------

def projects_for_tenant(tenant_id: int) -> QuerySet[Project]:
    """All projects for a tenant."""
    return Project.objects.filter(tenant_id=tenant_id)


def projects_by_status(tenant_id: int, status: str) -> QuerySet[Project]:
    return projects_for_tenant(tenant_id).filter(status=status)


def projects_for_member(tenant_id: int, user_id: int) -> QuerySet[Project]:
    """Projects where the user is a member (any role) or is the owner."""
    return projects_for_tenant(tenant_id).filter(
        Q(owner_id=user_id) | Q(memberships__user_id=user_id)
    ).distinct()


def project_by_public_id(tenant_id: int, public_id: str) -> Project:
    return Project.objects.get(tenant_id=tenant_id, public_id=public_id)


# ---------------------------------------------------------------------------
# Tags
# ---------------------------------------------------------------------------

def tags_for_tenant(tenant_id: int) -> QuerySet[ProjectTag]:
    return ProjectTag.objects.filter(tenant_id=tenant_id).order_by("name")


# ---------------------------------------------------------------------------
# Members
# ---------------------------------------------------------------------------

def members_for_project(project_id: int) -> QuerySet[ProjectMember]:
    return ProjectMember.objects.filter(project_id=project_id).select_related("user")


# ---------------------------------------------------------------------------
# Phases
# ---------------------------------------------------------------------------

def phases_for_project(project_id: int) -> QuerySet[ProjectPhase]:
    return ProjectPhase.objects.filter(project_id=project_id).order_by("order")


# ---------------------------------------------------------------------------
# Milestones
# ---------------------------------------------------------------------------

def milestones_for_project(project_id: int) -> QuerySet[Milestone]:
    return Milestone.objects.filter(project_id=project_id).order_by("due_date")
