"""Chapter leadership requests: member asks → officer approves → member leads."""
from __future__ import annotations

import pytest
from django.test import Client
from django.urls import reverse

from apps.alumni.engagement.models import (
    ChapterLeadershipRequest,
    GroupMembership,
    LeadershipRequestStatus,
    NetworkGroup,
)


def _chapter_with_member(user):
    group = NetworkGroup.objects.create(title="Kenya Chapter", kind="country")
    GroupMembership.objects.create(user=user, group=group, role="member")
    return group


@pytest.mark.django_db
def test_member_can_request_to_lead(client, alumni_user):
    group = _chapter_with_member(alumni_user)
    client.force_login(alumni_user)
    resp = client.post(
        reverse("alumni_engagement:group_lead_request", args=[group.slug]),
        {"message": "I already run the meetups."},
    )
    assert resp.status_code == 302
    req = ChapterLeadershipRequest.objects.get(user=alumni_user, group=group)
    assert req.status == LeadershipRequestStatus.PENDING
    assert req.message == "I already run the meetups."


@pytest.mark.django_db
def test_non_member_cannot_request(client, alumni_user):
    group = NetworkGroup.objects.create(title="Kenya Chapter", kind="country")
    client.force_login(alumni_user)
    resp = client.post(
        reverse("alumni_engagement:group_lead_request", args=[group.slug])
    )
    assert resp.status_code == 302  # bounced with an error message
    assert not ChapterLeadershipRequest.objects.filter(user=alumni_user).exists()


@pytest.mark.django_db
def test_officer_approval_promotes_member_to_leader(
    client, alumni_user, alumni_officer_user
):
    group = _chapter_with_member(alumni_user)
    client.force_login(alumni_user)
    client.post(reverse("alumni_engagement:group_lead_request", args=[group.slug]))
    req = ChapterLeadershipRequest.objects.get(user=alumni_user, group=group)

    officer = Client()
    officer.force_login(alumni_officer_user)
    resp = officer.post(
        reverse("alumni_engagement:leadership_request_approve", args=[req.pk])
    )
    assert resp.status_code == 302
    req.refresh_from_db()
    assert req.status == LeadershipRequestStatus.APPROVED
    assert req.reviewed_by_id == alumni_officer_user.pk
    # The member is now a chapter leader (moderator).
    assert GroupMembership.objects.get(user=alumni_user, group=group).role == "moderator"


@pytest.mark.django_db
def test_officer_decline_records_status(client, alumni_user, alumni_officer_user):
    group = _chapter_with_member(alumni_user)
    client.force_login(alumni_user)
    client.post(reverse("alumni_engagement:group_lead_request", args=[group.slug]))
    req = ChapterLeadershipRequest.objects.get(user=alumni_user, group=group)

    officer = Client()
    officer.force_login(alumni_officer_user)
    resp = officer.post(
        reverse("alumni_engagement:leadership_request_decline", args=[req.pk]),
        {"review_notes": "Let's revisit next quarter."},
    )
    assert resp.status_code == 302
    req.refresh_from_db()
    assert req.status == LeadershipRequestStatus.DECLINED
    assert req.review_notes == "Let's revisit next quarter."
    # Still a plain member, not promoted.
    assert GroupMembership.objects.get(user=alumni_user, group=group).role == "member"


@pytest.mark.django_db
def test_queue_denied_to_non_staff(client, alumni_user):
    client.force_login(alumni_user)
    resp = client.get(reverse("alumni_engagement:leadership_request_queue"))
    assert resp.status_code in (403, 302)
