"""Smoke tests for the aggregate MEL REST API router.

Verifies every ViewSet returns a 200 (or 401/403) for authenticated users —
catches class-level wiring regressions (missing imports, broken querysets,
permissions misconfigured).
"""
from __future__ import annotations

import pytest
from django.contrib.auth import get_user_model
from rest_framework.test import APIClient

from apps.core.permissions.roles import UserRole

pytestmark = pytest.mark.django_db

User = get_user_model()


ENDPOINTS = [
    "/mel/api/v1/logframes/",
    "/mel/api/v1/logframe-rows/",
    "/mel/api/v1/indicators/",
    "/mel/api/v1/indicator-targets/",
    "/mel/api/v1/data-points/",
    "/mel/api/v1/events/",
    "/mel/api/v1/activities/",
    "/mel/api/v1/activity-dependencies/",
    "/mel/api/v1/outputs/",
    "/mel/api/v1/corrective-actions/",
    "/mel/api/v1/report-templates/",
    "/mel/api/v1/reports/",
    "/mel/api/v1/report-artifacts/",
    "/mel/api/v1/report-distributions/",
    "/mel/api/v1/compliance-alerts/",
    "/mel/api/v1/feedback-channels/",
    "/mel/api/v1/feedback-submissions/",
    "/mel/api/v1/tracer-studies/",
    "/mel/api/v1/tracer-responses/",
    "/mel/api/v1/course-evaluations/",
]


@pytest.fixture
def officer_client() -> APIClient:
    officer = User.objects.create_user(email="api-officer@example.com", password="x")
    officer.role = UserRole.MEL_OFFICER.value
    officer.save(update_fields=["role"])
    c = APIClient()
    c.force_authenticate(officer)
    return c


@pytest.mark.parametrize("url", ENDPOINTS)
def test_officer_can_list_every_endpoint(officer_client, url):
    response = officer_client.get(url)
    assert response.status_code == 200, (
        f"{url} returned {response.status_code}: {response.content[:200]!r}"
    )
    data = response.json()
    # DRF list responses are paginated ({'results': [...]}) or bare lists.
    assert "results" in data or isinstance(data, list), f"Unexpected shape at {url}"


def test_unauthenticated_requests_are_rejected():
    c = APIClient()
    response = c.get("/mel/api/v1/indicators/")
    assert response.status_code in (401, 403)
