"""Tests for the officer-facing FeedbackChannel create/update views."""
from __future__ import annotations

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

from apps.core.permissions.roles import UserRole
from apps.mel.feedback.models import FeedbackChannel, FeedbackChannelType

pytestmark = pytest.mark.django_db

User = get_user_model()


def _officer():
    user = User.objects.create_user(email="officer-ch@example.com", password="x")
    user.role = UserRole.MEL_OFFICER.value
    user.save(update_fields=["role"])
    return user


def test_officer_can_create_channel_via_ui():
    client = Client()
    client.force_login(_officer())
    response = client.post(
        reverse("mel_feedback:channel_create"),
        {
            "type": FeedbackChannelType.BENEFICIARY,
            "name": "New beneficiary intake",
            "slug": "new-beneficiary-intake",
            "description": "Collect feedback from the 2026 intake cohort.",
            "is_public": "on",
            "is_active": "on",
        },
    )
    assert response.status_code == 302  # redirect to channel_list
    channel = FeedbackChannel.objects.get(slug="new-beneficiary-intake")
    assert channel.type == FeedbackChannelType.BENEFICIARY
    assert channel.is_public is True
    assert channel.token  # auto-generated on save


def test_officer_cannot_set_opens_after_closes():
    client = Client()
    client.force_login(_officer())
    response = client.post(
        reverse("mel_feedback:channel_create"),
        {
            "type": FeedbackChannelType.GENERIC,
            "name": "Bad window",
            "slug": "bad-window",
            "opens_at": "2026-06-01T09:00",
            "closes_at": "2026-05-01T09:00",
            "is_active": "on",
        },
    )
    # Form error — stays on the same page (200).
    assert response.status_code == 200
    assert not FeedbackChannel.objects.filter(slug="bad-window").exists()


def test_officer_cannot_access_without_role():
    user = User.objects.create_user(email="nonstaff@example.com", password="x")
    # Leave role blank — no access.
    client = Client()
    client.force_login(user)
    response = client.get(reverse("mel_feedback:channel_create"))
    assert response.status_code in (302, 403)  # PermissionDenied or redirect to login
