"""WS2 defect #21 — feed-failure manual repair can carry a funding amount.

A repaired ``funding_secured`` feed must credit ``funding_secured_total`` so the
MEI006/MEI013 KPI reflects manually-entered funding.
"""
from __future__ import annotations

from decimal import Decimal

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

from apps.core.permissions.roles import UserRole
from apps.mel.tracking.models import SMEHubFeedHandlerLog, SMEHubTrackingRecord
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="ws2f-adm@example.com", password="x",
        is_superuser=True, is_staff=True, role=UserRole.SYSTEM_ADMIN,
    )


@pytest.fixture
def record(admin):
    user = User.objects.create_user(email="ws2f-e@example.com", password="x", role=UserRole.ENTREPRENEUR)
    profile = EntrepreneurProfile.objects.create(user=user, country="UG", organisation="Co")
    profile.verify(by_user=admin)
    profile.save()
    biz = Business.objects.create(
        entrepreneur=profile, name="Agri Co", sector="Agriculture",
        business_stage=BusinessStage.MVP, country="UG",
    )
    biz.verify(by_user=admin)
    biz.save()
    return SMEHubTrackingRecord.objects.create(entrepreneur=profile, business=biz)


def test_manual_entry_with_amount_bumps_funding_total(record, admin):
    assert record.funding_secured_total == Decimal("0")
    record.record_manual_entry(
        bucket="sp5_investment", key="funding_secured", note="grant",
        reason="repaired feed", by_user=admin, amount=Decimal("12000"),
    )
    fresh = SMEHubTrackingRecord.objects.get(pk=record.pk)
    assert fresh.funding_secured_total == Decimal("12000")
    # The amount is preserved on the milestone payload for the audit trail.
    entry = fresh.sp5_investment[-1]
    assert entry["payload"]["amount"] == "12000"


def test_manual_entry_non_funding_key_ignores_amount(record, admin):
    record.record_manual_entry(
        bucket="sp3_partnerships", key="mou_formalised", note="",
        reason="repaired", by_user=admin, amount=Decimal("9999"),
    )
    fresh = SMEHubTrackingRecord.objects.get(pk=record.pk)
    assert fresh.funding_secured_total == Decimal("0")


def test_resolve_view_credits_funding(client, record, admin):
    log = SMEHubFeedHandlerLog.objects.create(
        signal_name="smehub_funding_secured", error="boom", entrepreneur=record.entrepreneur,
    )
    client.force_login(admin)
    resp = client.post(
        reverse("mel_tracking:smehub_feed_failure_resolve", kwargs={"pk": log.pk}),
        data={
            "reason": "manual repair with value",
            "manual_entry": "1",
            "bucket": "sp5_investment",
            "entry_key": "funding_secured",
            "amount": "25000",
        },
    )
    assert resp.status_code == 302
    fresh = SMEHubTrackingRecord.objects.get(pk=record.pk)
    assert fresh.funding_secured_total == Decimal("25000")
    log.refresh_from_db()
    assert log.resolved_at is not None
    assert log.manual_entry is True
