"""Slice A · INC role-gate backstop.

Asserts that non-entrepreneurs cannot POST to ``application_submit_view``.
"""
from __future__ import annotations

from datetime import date

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.smehub.incubation.models import Application, Programme
from apps.smehub.onboarding.models import Business, BusinessStage, EntrepreneurProfile

User = get_user_model()
pytestmark = pytest.mark.django_db


@pytest.fixture
def admin():
    return User.objects.create_user(
        email="adm-rg@example.com", password="x",
        is_superuser=True, is_staff=True, role=UserRole.SYSTEM_ADMIN,
    )


@pytest.fixture
def entrepreneur(admin):
    user = User.objects.create_user(email="ent-rg@example.com", password="x", role=UserRole.ENTREPRENEUR)
    profile = EntrepreneurProfile.objects.create(user=user, country="UG", organisation="Co")
    profile.verify(by_user=admin)
    profile.save()
    return profile


@pytest.fixture
def verified_business(entrepreneur, admin):
    biz = Business.objects.create(
        entrepreneur=entrepreneur,
        name="RoleGate Biz",
        sector="Agriculture",
        business_stage=BusinessStage.MVP,
        country="UG",
    )
    biz.verify(by_user=admin)
    biz.save()
    return biz


@pytest.fixture
def application(admin, entrepreneur, verified_business):
    programme = Programme.objects.create(
        title="RG Programme",
        slug="rg-prog",
        cohort_size=10,
        duration_weeks=12,
    )
    return Application.objects.create(
        programme=programme,
        entrepreneur=entrepreneur,
        business=verified_business,
        business_description="Test business description.",
        problem_statement="Test problem statement.",
    )


def test_buyer_cannot_submit_application(application):
    buyer = User.objects.create_user(email="buyer-rg@example.com", password="x", role=UserRole.BUYER)
    client = Client()
    client.force_login(buyer)
    resp = client.post(reverse("smehub_incubation:application_submit", args=[application.pk]))
    assert resp.status_code == 403


def test_judge_cannot_submit_application(application):
    judge = User.objects.create_user(email="judge-rg@example.com", password="x", role=UserRole.JUDGE)
    client = Client()
    client.force_login(judge)
    resp = client.post(reverse("smehub_incubation:application_submit", args=[application.pk]))
    assert resp.status_code == 403


def test_anonymous_redirects_to_login(application):
    client = Client()
    resp = client.post(reverse("smehub_incubation:application_submit", args=[application.pk]))
    # Login-required redirect (302) or 403 are both acceptable; we expect 302.
    assert resp.status_code in (302, 403)
