"""Pagination of the admin directory's detail-page collections.

``AdminDirectoryListView`` is a ``TemplateView`` that hangs six unbounded
querysets (partners/providers × pending/verified/deactivated) off one page.
Each is paginated with ``paginate_qs`` under its own ``?<param>=N`` so the
pagers advance independently. These tests pin that distinct-param isolation
and that totals come from ``paginator.count`` (a ``Page`` is truthy and its
``len`` is the page size, not the total).

The view is admin-only and the MFA middleware 302s admin requests made
through the test client, so we drive it with ``RequestFactory`` (no
middleware) and assert on ``context_data`` directly.
"""
from __future__ import annotations

import pytest
from django.contrib.auth import get_user_model
from django.test import RequestFactory

from apps.core.permissions.roles import UserRole
from apps.smehub.linkage.models import PartnerDirectoryEntry
from apps.smehub.linkage.views import AdminDirectoryListView

User = get_user_model()
pytestmark = pytest.mark.django_db


@pytest.fixture
def admin():
    return User.objects.create_user(
        email="adm-pag@example.com", password="x",
        is_staff=True, is_superuser=True, role=UserRole.SYSTEM_ADMIN,
    )


def _make_partners(n: int, status: str) -> None:
    PartnerDirectoryEntry.objects.bulk_create([
        PartnerDirectoryEntry(
            organisation_name=f"{status}-partner-{i:03d}",
            org_type=PartnerDirectoryEntry.OrgType.NGO,
            verification_status=status,
        )
        for i in range(n)
    ])


def _render(admin, query: dict | None = None):
    request = RequestFactory().get("/", query or {})
    request.user = admin
    response = AdminDirectoryListView.as_view()(request)
    return response.context_data


def test_admin_directory_pagers_are_independent(admin):
    # 26 pending + 26 verified → two pages each at the default per_page=25.
    _make_partners(26, PartnerDirectoryEntry.Status.PENDING)
    _make_partners(26, PartnerDirectoryEntry.Status.VERIFIED)

    ctx = _render(admin)
    pending = ctx["partners_pending"]
    verified = ctx["partners_verified"]
    # Totals come from the paginator, not the page slice.
    assert pending.paginator.count == 26
    assert verified.paginator.count == 26
    assert pending.paginator.num_pages == 2
    assert pending.number == 1
    assert verified.number == 1

    # Advancing the pending pager leaves the verified pager on page 1.
    ctx2 = _render(admin, {"partners_pending_page": 2})
    assert ctx2["partners_pending"].number == 2
    assert ctx2["partners_verified"].number == 1


def test_admin_directory_out_of_range_clamps(admin):
    """get_page semantics — an absurd page number clamps instead of 404ing."""
    _make_partners(3, PartnerDirectoryEntry.Status.PENDING)
    ctx = _render(admin, {"partners_pending_page": 999})
    assert ctx["partners_pending"].number == 1
