"""HTMX partial tests for operations partner_list and mou_list.

Verifies:
- HTMX requests return the *_list_results.html partial only (no <html>).
- Standard GETs return the full page.
- Search filters apply on q query-param for both views.
- Empty-state HTML uses empty-panel__title.
"""

from __future__ import annotations

from datetime import date

import pytest
from django.contrib.auth import get_user_model
from django.urls import reverse

from apps.core.permissions.roles import UserRole
from apps.rims.operations.models import MOU, Partner

User = get_user_model()


@pytest.fixture
def admin_user(db):
    u = User.objects.create_user(email="ops.admin@example.com", password="pw")
    u.role = UserRole.ADMIN
    u.is_staff = True
    u.save()
    return u


@pytest.fixture
def partners(db):
    Partner.objects.create(name="Alpha Foundation", country="Uganda", partner_type="funder")
    Partner.objects.create(name="Beta Research", country="Kenya", partner_type="research")
    Partner.objects.create(name="Gamma NGO", country="Uganda", partner_type="ngo")
    return Partner.objects.all()


@pytest.fixture
def mous(db, partners):
    p = partners.first()
    MOU.objects.create(partner=p, title="Alpha Collaboration MOU", status="active",
                       signed_on=date(2024, 1, 15))
    MOU.objects.create(partner=partners.last(), title="Gamma Programme MOU",
                       status="draft")
    return MOU.objects.all()


# --- Partner list ----------------------------------------------------------

@pytest.mark.django_db
def test_partner_list_full_page(client, admin_user, partners):
    client.force_login(admin_user)
    resp = client.get(reverse("rims_operations:partner_list"))
    assert resp.status_code == 200
    body = resp.content.decode()
    assert "Alpha Foundation" in body
    assert "<html" in body or "data-htmx-error-region" in body  # full page chrome


@pytest.mark.django_db
def test_partner_list_htmx_returns_partial(client, admin_user, partners):
    client.force_login(admin_user)
    resp = client.get(
        reverse("rims_operations:partner_list"),
        HTTP_HX_REQUEST="true",
    )
    assert resp.status_code == 200
    body = resp.content.decode()
    assert "Alpha Foundation" in body
    assert "<html" not in body
    # The full-page page-intro / breadcrumb chrome should NOT be in a partial.
    assert "Operations registry" not in body


@pytest.mark.django_db
def test_partner_list_search_filters_by_name(client, admin_user, partners):
    client.force_login(admin_user)
    resp = client.get(
        reverse("rims_operations:partner_list") + "?q=Alpha",
        HTTP_HX_REQUEST="true",
    )
    assert resp.status_code == 200
    body = resp.content.decode()
    assert "Alpha Foundation" in body
    assert "Beta Research" not in body
    assert "Gamma NGO" not in body


@pytest.mark.django_db
def test_partner_list_empty_state(client, admin_user, partners):
    client.force_login(admin_user)
    resp = client.get(
        reverse("rims_operations:partner_list") + "?q=ZZZNoMatch",
        HTTP_HX_REQUEST="true",
    )
    assert resp.status_code == 200
    body = resp.content.decode()
    assert "empty-panel__title" in body
    assert "ZZZNoMatch" in body


# --- MOU list --------------------------------------------------------------

@pytest.mark.django_db
def test_mou_list_full_page(client, admin_user, mous):
    client.force_login(admin_user)
    resp = client.get(reverse("rims_operations:mou_list"))
    assert resp.status_code == 200
    body = resp.content.decode()
    assert "Alpha Collaboration MOU" in body


@pytest.mark.django_db
def test_mou_list_htmx_returns_rows(client, admin_user, mous):
    client.force_login(admin_user)
    resp = client.get(
        reverse("rims_operations:mou_list"),
        HTTP_HX_REQUEST="true",
    )
    assert resp.status_code == 200
    body = resp.content.decode()
    assert "<html" not in body
    assert "<tr" in body
    assert "Alpha Collaboration MOU" in body


@pytest.mark.django_db
def test_mou_list_search_filters(client, admin_user, mous):
    client.force_login(admin_user)
    resp = client.get(
        reverse("rims_operations:mou_list") + "?q=Gamma",
        HTTP_HX_REQUEST="true",
    )
    assert resp.status_code == 200
    body = resp.content.decode()
    assert "Gamma Programme MOU" in body
    assert "Alpha Collaboration MOU" not in body


@pytest.mark.django_db
def test_mou_list_empty_state(client, admin_user, mous):
    client.force_login(admin_user)
    resp = client.get(
        reverse("rims_operations:mou_list") + "?q=NoSuchMou",
        HTTP_HX_REQUEST="true",
    )
    assert resp.status_code == 200
    body = resp.content.decode()
    assert "empty-panel__title" in body
