"""Smoke tests for scholarships 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-sch@example.com", password="pw-tu")
    u.role = UserRole.ADMIN
    u.is_staff = True
    u.save()
    return u


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


@pytest.mark.django_db
@pytest.mark.parametrize(
    "url_name,sort_key",
    [
        ("rims_scholarships:scholarship_list", "name"),
        ("rims_scholarships:scholar_list", "enrolled"),
        ("rims_scholarships:stipend_list", "paid"),
        ("rims_scholarships: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_scholarships:scholarship_list",
        "rims_scholarships:scholar_list",
        "rims_scholarships:stipend_list",
    ],
)
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_my_scholarships_smoke(client, scholar_user):
    client.force_login(scholar_user)
    url = reverse("rims_scholarships:my_scholarships")
    assert client.get(url).status_code == 200
    assert client.get(f"{url}?sort=enrolled").status_code == 200
    assert client.get(f"{url}?export=csv").status_code == 200


@pytest.mark.django_db
def test_htmx_scholarship_list_returns_partial(client, admin_user):
    _bypass_mfa(admin_user)
    client.force_login(admin_user)
    resp = client.get(reverse("rims_scholarships:scholarship_list"), HTTP_HX_REQUEST="true")
    assert resp.status_code == 200
    assert "<html" not in resp.content.decode().lower()
