"""P1 (assessment §3 #6) — MilestoneEvidence acceptance → AwardTranche.APPROVED.

Coverage:
- Accepting the only evidence row on a REQUESTED tranche moves it to APPROVED.
- Partial acceptance (one of two evidence rows) does NOT flip the tranche.
- A tranche already in DISBURSED is not regressed when stale evidence is touched.
"""
from __future__ import annotations

from datetime import timedelta
from decimal import Decimal

import pytest
from django.utils import timezone

from apps.rims.grants.models import (
    Application,
    Award,
    AwardTranche,
    GrantCall,
    MilestoneEvidence,
)


def _setup_award_and_tranche(applicant, *, tranche_status=AwardTranche.Status.REQUESTED):
    call = GrantCall.objects.create(
        title="P1 evidence call",
        slug=f"p1-ev-{int(timezone.now().timestamp() * 1000) % 10_000_000}",
        opens_at=timezone.now() - timedelta(days=2),
        closes_at=timezone.now() + timedelta(days=10),
        status=GrantCall.Status.PUBLISHED,
    )
    application = Application.objects.create(
        call=call,
        applicant=applicant,
        status=Application.Status.AWARDED,
    )
    award = Award.objects.create(
        application=application,
        amount=Decimal("10000"),
        currency="USD",
        status=Award.Status.ACTIVE,
        project_end_date=(timezone.now() + timedelta(days=365)).date(),
    )
    tranche = AwardTranche.objects.create(
        award=award,
        label="Tranche 1",
        amount=Decimal("5000"),
        status=tranche_status,
    )
    return application, award, tranche


@pytest.mark.django_db
def test_evidence_accept_releases_requested_tranche(applicant_user):
    _, _, tranche = _setup_award_and_tranche(applicant_user)
    evidence = MilestoneEvidence.objects.create(
        tranche=tranche,
        summary="Report v1",
    )
    evidence.review_status = MilestoneEvidence.ReviewStatus.ACCEPTED
    evidence.save()
    tranche.refresh_from_db()
    assert tranche.status == AwardTranche.Status.APPROVED


@pytest.mark.django_db
def test_partial_acceptance_holds_tranche(applicant_user):
    _, _, tranche = _setup_award_and_tranche(applicant_user)
    e1 = MilestoneEvidence.objects.create(tranche=tranche, summary="A")
    MilestoneEvidence.objects.create(tranche=tranche, summary="B")  # remains SUBMITTED
    e1.review_status = MilestoneEvidence.ReviewStatus.ACCEPTED
    e1.save()
    tranche.refresh_from_db()
    assert tranche.status == AwardTranche.Status.REQUESTED


@pytest.mark.django_db
def test_disbursed_tranche_not_regressed(applicant_user):
    _, _, tranche = _setup_award_and_tranche(
        applicant_user, tranche_status=AwardTranche.Status.DISBURSED
    )
    evidence = MilestoneEvidence.objects.create(tranche=tranche, summary="Late")
    evidence.review_status = MilestoneEvidence.ReviewStatus.ACCEPTED
    evidence.save()
    tranche.refresh_from_db()
    assert tranche.status == AwardTranche.Status.DISBURSED
