"""P1 (assessment §3 #5) — FundingRecord auto-close when all child Awards close.

Coverage:
- Single APPROVED FundingRecord with one Award. When the Award is CLOSED and
  the FundingRecordCloseout flag is CLOSED, the parent FundingRecord moves to
  CLOSED.
- When FundingRecordCloseout is still READY (close-out not yet run), the
  parent FundingRecord stays APPROVED.
"""
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,
    FundingRecord,
    FundingRecordCloseout,
    GrantCall,
)
from apps.rims.operations.models import Partner


@pytest.fixture
def funding_record(db):
    partner = Partner.objects.create(name="Funder", partner_type=Partner.PartnerType.FUNDER)
    return FundingRecord.objects.create(
        title="P1 auto-close FR",
        partner=partner,
        amount=Decimal("100000"),
        currency="USD",
        start_date=timezone.now().date(),
        end_date=timezone.now().date() + timedelta(days=365),
        status=FundingRecord.Status.APPROVED,
    )


def _award_under(funding_record, applicant):
    call = GrantCall.objects.create(
        title="P1 auto-close call",
        slug=f"p1-ac-{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,
        funding_record=funding_record,
    )
    application = Application.objects.create(
        call=call,
        applicant=applicant,
        status=Application.Status.AWARDED,
    )
    return Award.objects.create(
        application=application,
        amount=Decimal("50000"),
        currency="USD",
        status=Award.Status.ACTIVE,
        project_end_date=(timezone.now() + timedelta(days=365)).date(),
    )


@pytest.mark.django_db
def test_funding_record_auto_closes_when_final_closeout_complete(applicant_user, funding_record):
    award = _award_under(funding_record, applicant_user)
    closeout = FundingRecordCloseout.objects.create(
        funding_record=funding_record,
        status=FundingRecordCloseout.Status.CLOSED,
    )
    # Close the award — signal should flip the parent FundingRecord.
    award.status = Award.Status.CLOSED
    award.save()
    funding_record.refresh_from_db()
    assert funding_record.status == FundingRecord.Status.CLOSED


@pytest.mark.django_db
def test_funding_record_stays_open_until_closeout_run(applicant_user, funding_record):
    award = _award_under(funding_record, applicant_user)
    # No closeout record yet — signal only creates READY, doesn't promote parent.
    award.status = Award.Status.CLOSED
    award.save()
    funding_record.refresh_from_db()
    assert funding_record.status == FundingRecord.Status.APPROVED
