"""Phase 8 — Regulatory & Policy Navigation UI views."""
from __future__ import annotations

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

from apps.core.permissions.roles import UserRole
from apps.smehub.linkage.models import RegulatoryGuide
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-r8@example.com", password="x",
        is_staff=True, is_superuser=True, role=UserRole.SYSTEM_ADMIN,
    )


@pytest.fixture
def sme_admin():
    return User.objects.create_user(
        email="sa-r8@example.com", password="x", role=UserRole.SME_ADMIN,
    )


@pytest.fixture
def entrepreneur(admin):
    user = User.objects.create_user(
        email="ent-r8@example.com", password="x", role=UserRole.ENTREPRENEUR,
    )
    profile = EntrepreneurProfile.objects.create(user=user, country="Uganda")
    profile.verify(by_user=admin)
    profile.save()
    biz = Business.objects.create(
        entrepreneur=profile, name="R8 Biz", sector="Agriculture",
        business_stage=BusinessStage.MVP, country="Uganda",
    )
    biz.verify(by_user=admin)
    biz.save()
    return profile


def test_admin_list_blocks_anonymous(client):
    resp = client.get(reverse("smehub_linkage:regulatory_admin_list"))
    assert resp.status_code in (302, 403)


def test_admin_list_blocks_entrepreneur(client, entrepreneur):
    client.force_login(entrepreneur.user)
    resp = client.get(reverse("smehub_linkage:regulatory_admin_list"))
    assert resp.status_code == 403


def test_admin_list_renders_for_sme_admin(client, sme_admin):
    RegulatoryGuide.objects.create(
        title="UG Agro Standards", slug="ug-agro-r8",
        body_type=RegulatoryGuide.BodyType.STANDARD,
        sectors=["Agriculture"], countries=["Uganda"], summary="x",
    )
    client.force_login(sme_admin)
    resp = client.get(reverse("smehub_linkage:regulatory_admin_list"))
    assert resp.status_code == 200
    assert b"UG Agro Standards" in resp.content


def test_admin_create_view_persists(client, sme_admin):
    client.force_login(sme_admin)
    resp = client.post(
        reverse("smehub_linkage:regulatory_admin_create"),
        data={
            "title": "Created Guide",
            "slug": "created-guide-r8",
            "body_type": RegulatoryGuide.BodyType.LICENSING,
            "sectors": ["Agriculture"],
            "countries": ["Uganda"],
            "summary": "Body",
            "issuing_authority": "UNBS",
            "official_link": "https://unbs.go.ug/",
            "is_active": "on",
        },
    )
    assert resp.status_code == 302
    g = RegulatoryGuide.objects.get(slug="created-guide-r8")
    assert g.created_by == sme_admin
    assert g.is_active is True


def test_admin_toggle_flips_is_active(client, sme_admin):
    g = RegulatoryGuide.objects.create(
        title="Toggle Me", slug="toggle-me-r8",
        body_type=RegulatoryGuide.BodyType.OTHER,
        summary="x", is_active=True,
    )
    client.force_login(sme_admin)
    resp = client.post(reverse("smehub_linkage:regulatory_admin_toggle", kwargs={"pk": g.pk}))
    assert resp.status_code == 302
    g.refresh_from_db()
    assert g.is_active is False
    # Toggle again
    client.post(reverse("smehub_linkage:regulatory_admin_toggle", kwargs={"pk": g.pk}))
    g.refresh_from_db()
    assert g.is_active is True


def test_browse_view_shows_matching_guides(client, entrepreneur):
    matched = RegulatoryGuide.objects.create(
        title="Matched Guide", slug="match-r8",
        body_type=RegulatoryGuide.BodyType.STANDARD,
        sectors=["Agriculture"], countries=["Uganda"], summary="x",
    )
    RegulatoryGuide.objects.create(
        title="Off-topic Guide", slug="off-r8",
        body_type=RegulatoryGuide.BodyType.STANDARD,
        sectors=["Health"], countries=["Kenya"], summary="x",
    )
    client.force_login(entrepreneur.user)
    resp = client.get(reverse("smehub_linkage:regulatory_browse"))
    assert resp.status_code == 200
    assert b"Matched Guide" in resp.content
    assert b"Off-topic Guide" not in resp.content


def test_browse_view_blocks_non_entrepreneur(client, sme_admin):
    client.force_login(sme_admin)
    resp = client.get(reverse("smehub_linkage:regulatory_browse"))
    assert resp.status_code == 403
