"""Slice A · investment P0 hardening tests.

* A10 — ``record_manual_funding`` rejects unverified businesses.
"""
from __future__ import annotations

from datetime import datetime, timezone as dt_timezone
from decimal import Decimal

import pytest
from django.contrib.auth import get_user_model

from apps.core.permissions.roles import UserRole
from apps.smehub.investment import services
from apps.smehub.investment.services import InvestmentStateError
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-ia@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-ia@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 unverified_business(entrepreneur):
    return Business.objects.create(
        entrepreneur=entrepreneur,
        name="UnverifiedCo",
        sector="Agriculture",
        business_stage=BusinessStage.IDEA,
        country="UG",
    )


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


def test_manual_funding_blocked_on_unverified_business(admin, entrepreneur, unverified_business):
    with pytest.raises(InvestmentStateError):
        services.record_manual_funding(
            by_admin=admin,
            entrepreneur=entrepreneur,
            business=unverified_business,
            funder_name="Ad-hoc grant",
            amount=Decimal("10000"),
            funded_at=datetime(2026, 1, 15, tzinfo=dt_timezone.utc),
            currency="USD",
        )


def test_manual_funding_allows_verified_business(admin, entrepreneur, verified_business):
    record = services.record_manual_funding(
        by_admin=admin,
        entrepreneur=entrepreneur,
        business=verified_business,
        funder_name="Ad-hoc grant",
        amount=Decimal("10000"),
        funded_at=datetime(2026, 1, 15, tzinfo=dt_timezone.utc),
        currency="USD",
    )
    assert record.pk is not None
    assert record.amount == Decimal("10000")
