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


@pytest.mark.django_db
@pytest.mark.parametrize(
    "url_name,sort_key",
    [
        ("rims_finance:budget_overview", "name"),
        ("rims_finance:disbursement_list", "created"),
        ("rims_finance:disbursement_approval_queue", "created"),
        ("rims_finance:expenditure_list", "incurred"),
        ("rims_finance:payment_batch_list", "created"),
    ],
)
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_finance:budget_overview",
        "rims_finance:disbursement_list",
        "rims_finance:expenditure_list",
        "rims_finance:payment_batch_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")
