"""Slice A · MarketDemandCreateView · view-level form gate.

Asserts that an unverified buyer cannot post a demand listing (FRSME-MPL015 / A4):
* POST with PENDING buyer → 200 form re-rendered with the awaiting-verification message.
* POST with VERIFIED buyer + valid data → 302 redirect to demand_detail.
"""
from __future__ import annotations

from datetime import datetime, timedelta, timezone as dt_timezone

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.marketplace.models import (
    BuyerRegistryEntry,
    MarketDemandListing,
)

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


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


@pytest.fixture
def buyer_user():
    return User.objects.create_user(
        email="buyer-mv@example.com", password="x", role=UserRole.BUYER,
    )


@pytest.fixture
def pending_buyer(buyer_user):
    return BuyerRegistryEntry.objects.create(
        user=buyer_user,
        organisation_name="Pending Buyer Co",
        org_type=BuyerRegistryEntry.OrgType.WHOLESALE,
    )


@pytest.fixture
def verified_buyer(buyer_user, admin):
    entry = BuyerRegistryEntry.objects.create(
        user=buyer_user,
        organisation_name="Verified Buyer Co",
        org_type=BuyerRegistryEntry.OrgType.RETAIL,
    )
    entry.verify(by_user=admin)
    entry.save()
    return entry


def _form_data() -> dict:
    deadline = datetime.now(dt_timezone.utc) + timedelta(days=14)
    return {
        "title": "Tomatoes — 5 tonnes",
        "kind": MarketDemandListing.Kind.PROCUREMENT,
        "description": "Bulk procurement opportunity.",
        "quantity": "5 tonnes",
        "deadline": deadline.strftime("%Y-%m-%dT%H:%M"),
    }


def test_pending_buyer_post_blocked(pending_buyer, buyer_user):
    """PENDING buyer is redirected to the buyer-profile form (GET and POST);
    no listing is created (browser QA F11 — no more asymmetric 403)."""
    client = Client()
    client.force_login(buyer_user)
    url = reverse("smehub_marketplace:demand_create")
    profile_url = reverse("smehub_marketplace:buyer_profile_form")
    resp = client.get(url)
    assert resp.status_code == 302
    assert resp.url == profile_url
    resp = client.post(url, _form_data())
    assert resp.status_code == 302
    assert resp.url == profile_url
    assert MarketDemandListing.objects.count() == 0


def test_verified_buyer_post_succeeds(verified_buyer, buyer_user):
    """VERIFIED buyer POST creates listing and redirects."""
    client = Client()
    client.force_login(buyer_user)
    url = reverse("smehub_marketplace:demand_create")
    resp = client.post(url, _form_data())
    # 302 redirect to demand_detail when valid.
    assert resp.status_code == 302
    assert MarketDemandListing.objects.count() == 1
    listing = MarketDemandListing.objects.first()
    assert listing.buyer_id == verified_buyer.pk


def test_non_buyer_role_403():
    """A non-buyer, non-superuser user should be blocked by BuyerRequired."""
    other = User.objects.create_user(
        email="other-mv@example.com", password="x", role=UserRole.JUDGE,
    )
    client = Client()
    client.force_login(other)
    url = reverse("smehub_marketplace:demand_create")
    resp = client.post(url, _form_data())
    assert resp.status_code == 403
