"""Submit-a-job button gating + post-submit redirect.

The board's "Submit a job" button must only render for users who actually pass
``PartnerJobSubmitView.test_func`` (staff, ``rep_career.post_job_listing`` perm,
or a *verified* partner directory entry) — an unverified partner used to see the
button and then hit a 403. The post-submit redirect must land on the board, not
the (always-empty-for-a-submitter) applications list.
"""
from __future__ import annotations

import pytest
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission
from django.urls import reverse

from apps.core.permissions.roles import UserRole
from apps.alumni.careers.models import JobListing
from apps.smehub.linkage.models import PartnerDirectoryEntry

User = get_user_model()

SUBMIT_URL_MARKER = "/alumni/jobs/submit/"


@pytest.fixture
def partner_user(db):
    u = User.objects.create_user(email="partner@example.com", password="pw-partner")
    u.role = UserRole.PARTNER
    u.save()
    return u


def _partner_entry(user, status):
    return PartnerDirectoryEntry.objects.create(
        organisation_name="GreenGrow Partners",
        org_type=PartnerDirectoryEntry.OrgType.CORPORATE,
        managed_by=user,
        verification_status=status,
    )


# ── Button gating on the board ─────────────────────────────────────────────


@pytest.mark.django_db
def test_plain_alumni_does_not_see_submit_button(client, alumni_user):
    client.force_login(alumni_user)
    resp = client.get(reverse("alumni_jobs:board"))
    assert resp.status_code == 200
    assert resp.context["can_submit_job"] is False
    assert SUBMIT_URL_MARKER not in resp.content.decode()


@pytest.mark.django_db
def test_partner_role_account_can_submit(client, partner_user):
    # Business rule: a partner-organisation *user account* (role=PARTNER) may
    # post opportunities — the account itself is the credential, and every
    # listing still goes through officer approval before publication. A
    # verified PartnerDirectoryEntry is no longer required to reach the form.
    _partner_entry(partner_user, PartnerDirectoryEntry.Status.PENDING)
    client.force_login(partner_user)
    resp = client.get(reverse("alumni_jobs:board"))
    assert resp.status_code == 200
    assert resp.context["can_submit_job"] is True
    assert SUBMIT_URL_MARKER in resp.content.decode()
    assert client.get(reverse("alumni_jobs:submit")).status_code == 200


@pytest.mark.django_db
def test_non_partner_non_staff_cannot_submit(client, alumni_user):
    # A plain alumnus with no partner role/entry/perm is still blocked.
    client.force_login(alumni_user)
    assert client.get(reverse("alumni_jobs:submit")).status_code == 403


@pytest.mark.django_db
def test_verified_partner_sees_submit_button(client, partner_user):
    _partner_entry(partner_user, PartnerDirectoryEntry.Status.VERIFIED)
    client.force_login(partner_user)
    resp = client.get(reverse("alumni_jobs:board"))
    assert resp.status_code == 200
    assert resp.context["can_submit_job"] is True
    assert SUBMIT_URL_MARKER in resp.content.decode()
    assert client.get(reverse("alumni_jobs:submit")).status_code == 200


@pytest.mark.django_db
def test_officer_sees_submit_button(client, alumni_officer_user):
    client.force_login(alumni_officer_user)
    resp = client.get(reverse("alumni_jobs:board"))
    assert resp.status_code == 200
    assert resp.context["can_submit_job"] is True
    assert SUBMIT_URL_MARKER in resp.content.decode()


@pytest.mark.django_db
def test_perm_holder_sees_submit_button(client, alumni_user):
    perm = Permission.objects.get(
        content_type__app_label="rep_career", codename="post_job_listing"
    )
    alumni_user.user_permissions.add(perm)
    alumni_user = User.objects.get(pk=alumni_user.pk)  # drop perm cache
    client.force_login(alumni_user)
    resp = client.get(reverse("alumni_jobs:board"))
    assert resp.status_code == 200
    assert resp.context["can_submit_job"] is True
    assert SUBMIT_URL_MARKER in resp.content.decode()


# ── Post-submit redirect ───────────────────────────────────────────────────


@pytest.mark.django_db
def test_submit_redirects_to_board_not_applications(client, alumni_officer_user):
    client.force_login(alumni_officer_user)
    resp = client.post(
        reverse("alumni_jobs:submit"),
        {
            "title": "Seed Systems Advisor",
            "company": "GreenGrow Partners",
            "location": "Kampala, UG",
            "job_type": JobListing.JobType.FULL_TIME,
            "sector": "Agriculture / Food Systems",
            "salary_range": "",
            "description": "Advise on certified seed distribution.",
            "requirements": "",
            "closes_at": "",
        },
    )
    assert resp.status_code in {301, 302}
    assert resp.url == reverse("alumni_jobs:board")
    listing = JobListing.objects.get(title="Seed Systems Advisor")
    assert listing.listing_status == JobListing.ListingStatus.PENDING
