"""Closes the SRS gap where Challenges have no dedicated progress-monitoring
model (unlike scholarships' AcademicProgressReport) — they previously fell
back to the generic milestone/tranche mechanism with no innovation-specific
reporting fields.
"""
from datetime import date, timedelta
from decimal import Decimal

import pytest
from django.db import IntegrityError
from django.utils import timezone

from apps.rims.grants.models import Application, ChallengeMilestoneReport, GrantCall, PrototypeStatus
from apps.rims.grants.services import award_application, shortlist_application, submit_application


def _challenge_award(applicant_user, institution, *, suffix="cmr"):
    call = GrantCall.objects.create(
        title="Challenge milestone call",
        slug=f"cmr-{suffix}-{int(timezone.now().timestamp())}",
        call_type=GrantCall.CallType.CHALLENGE,
        opens_at=timezone.now() - timedelta(days=1),
        closes_at=timezone.now() + timedelta(days=10),
        status=GrantCall.Status.PUBLISHED,
    )
    app = Application.objects.create(call=call, applicant=applicant_user, institution=institution)
    submit_application(app)
    app = Application.objects.get(pk=app.pk)
    shortlist_application(app)
    award_application(app, Decimal("1000"), date.today() + timedelta(days=180), narrative="")
    return Application.objects.get(pk=app.pk).award


@pytest.mark.django_db
def test_create_challenge_milestone_report(applicant_user, institution):
    award = _challenge_award(applicant_user, institution)
    report = ChallengeMilestoneReport.objects.create(
        award=award,
        period_label="Milestone 1",
        innovation_milestone_reached="Prototype field test complete",
        prototype_status=PrototypeStatus.FIELD_TESTED,
    )
    assert award.challenge_milestone_reports.count() == 1
    assert report.prototype_status == PrototypeStatus.FIELD_TESTED


@pytest.mark.django_db
def test_unique_period_per_award(applicant_user, institution):
    award = _challenge_award(applicant_user, institution, suffix="uniq")
    ChallengeMilestoneReport.objects.create(award=award, period_label="Milestone 1")
    with pytest.raises(IntegrityError):
        ChallengeMilestoneReport.objects.create(award=award, period_label="Milestone 1")
