"""Smoke tests for MEL DRF permission classes (Phase 0 plumbing)."""
from __future__ import annotations

from types import SimpleNamespace

import pytest

from apps.core.permissions.roles import UserRole
from apps.mel.permissions import CanViewMelData, IsMelOfficer


class _AnonView:
    pass


def _request(user):
    return SimpleNamespace(user=user)


def _user(*, role: str = "", is_authenticated: bool = True, is_superuser: bool = False):
    return SimpleNamespace(
        role=role,
        is_authenticated=is_authenticated,
        is_superuser=is_superuser,
    )


@pytest.mark.parametrize(
    "role,expected",
    [
        (UserRole.MEL_OFFICER.value, True),
        (UserRole.ADMIN.value, True),
        (UserRole.SYSTEM_ADMIN.value, True),
        (UserRole.PROGRAM_MANAGER.value, False),
        ("", False),
    ],
)
def test_is_mel_officer_role_gate(role, expected):
    perm = IsMelOfficer()
    assert perm.has_permission(_request(_user(role=role)), _AnonView()) is expected


def test_superuser_bypass_for_view_role():
    perm = CanViewMelData()
    assert perm.has_permission(_request(_user(is_superuser=True)), _AnonView()) is True


def test_anonymous_user_rejected():
    perm = IsMelOfficer()
    assert (
        perm.has_permission(_request(_user(role="", is_authenticated=False)), _AnonView())
        is False
    )


def test_can_view_mel_data_allows_programme_roles():
    perm = CanViewMelData()
    for role in (
        UserRole.PROGRAM_MANAGER.value,
        UserRole.PROGRAM_DIRECTOR.value,
        UserRole.GRANTS_MANAGER.value,
        UserRole.MEL_OFFICER.value,
    ):
        assert perm.has_permission(_request(_user(role=role)), _AnonView()) is True
