"""Membership-driven scope resolution."""

from __future__ import annotations

from collections.abc import Iterable

from django.db.models import QuerySet

from simorgh.apps.memberships.models import Membership, MembershipStatus
from simorgh.apps.organizations.models import OrganizationNode
from simorgh.apps.organizations.services import descendant_ids


def active_memberships_for(user_id: int, tenant_id: int) -> QuerySet[Membership]:
    return Membership.objects.filter(
        users__id=user_id,
        tenant_id=tenant_id,
        status=MembershipStatus.ACTIVE,
    ).select_related("role", "organization_node")


def assignable_node_ids(memberships: Iterable[Membership]) -> set[int]:
    """Org-node ids the actor can act on: their nodes + descendants."""

    nodes = [m.organization_node for m in memberships if m.organization_node_id]
    if not nodes:
        return set()
    return descendant_ids(nodes)


def assignable_nodes(user_id: int, tenant_id: int) -> QuerySet[OrganizationNode]:
    """Convenience wrapper used by views/UIs to populate org pickers."""

    memberships = list(active_memberships_for(user_id, tenant_id))
    ids = assignable_node_ids(memberships)
    if not ids:
        return OrganizationNode.objects.none()
    return OrganizationNode.objects.filter(tenant_id=tenant_id, pk__in=ids)
