"""Smoke tests for grants list-view table upgrades (sort + CSV)."""

from __future__ import annotations

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

from apps.core.authentication.models import MFADevice
from apps.core.permissions.roles import UserRole


def _bypass_mfa(user):
    MFADevice.objects.get_or_create(
        user=user,
        device_type=MFADevice.DeviceType.TOTP,
        defaults={"name": "Test TOTP", "secret": "JBSWY3DPEHPK3PXP", "is_verified": True},
    )


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


@pytest.fixture
def program_director_user(db):
    User = get_user_model()
    u = User.objects.create_user(email="pd.tableupgrade@example.com", password="pw-tu")
    u.role = UserRole.PROGRAM_DIRECTOR
    u.save()
    return u


@pytest.mark.django_db
@pytest.mark.parametrize(
    "url_name,sort_key",
    [
        ("rims_grants:application_list", "submitted"),
        ("rims_grants:funding_list", "title"),
        ("rims_grants:manager_call_list", "title"),
        ("rims_grants:manager_all_applications", "submitted"),
        ("rims_grants:application_archive_list", "submitted"),
        ("rims_grants:award_dashboard", "awarded"),
        ("rims_grants:review_queue", "due"),
        ("rims_grants:call_list", "title"),
    ],
)
def test_list_view_smoke(client, admin_user, url_name, sort_key):
    _bypass_mfa(admin_user)
    client.force_login(admin_user)
    url = reverse(url_name)
    assert client.get(url).status_code == 200
    assert client.get(f"{url}?sort={sort_key}").status_code == 200
    assert client.get(f"{url}?sort=-{sort_key}").status_code == 200
    assert client.get(f"{url}?sort=bogus_field").status_code == 200


@pytest.mark.django_db
@pytest.mark.parametrize(
    "url_name",
    [
        "rims_grants:application_list",
        "rims_grants:funding_list",
        "rims_grants:manager_call_list",
        "rims_grants:manager_all_applications",
        "rims_grants:application_archive_list",
        "rims_grants:award_dashboard",
    ],
)
def test_list_view_csv_export(client, admin_user, url_name):
    _bypass_mfa(admin_user)
    client.force_login(admin_user)
    resp = client.get(reverse(url_name) + "?export=csv")
    assert resp.status_code == 200
    assert resp["Content-Type"].startswith("text/csv")


@pytest.mark.django_db
def test_funding_approval_queue_sort_only(client, program_director_user):
    _bypass_mfa(program_director_user)
    client.force_login(program_director_user)
    url = reverse("rims_grants:funding_approval_queue")
    assert client.get(url).status_code == 200
    assert client.get(f"{url}?sort=amount").status_code == 200


@pytest.mark.django_db
@pytest.mark.parametrize(
    "url_name",
    ["rims_grants:application_list", "rims_grants:funding_list"],
)
def test_htmx_request_returns_partial(client, admin_user, url_name):
    _bypass_mfa(admin_user)
    client.force_login(admin_user)
    resp = client.get(reverse(url_name), HTTP_HX_REQUEST="true")
    assert resp.status_code == 200
    assert "<html" not in resp.content.decode().lower()
