"""Closes the gap where GrantCall already models challenge-specific call
configuration (innovation stage, sector focus, prize tiers) but Application
had no challenge-side profile, and the old challengehub.ApplicationPartners
(consortium/bidding partner orgs) had no new-system equivalent at all.
"""
import datetime
import uuid

import pytest
from django.utils import timezone

from apps.rims.grants.models import (
    Application,
    ApplicationPartner,
    ChallengeApplicationProfile,
    GrantCall,
)


def _challenge_call():
    return GrantCall.objects.create(
        title="Innovation challenge",
        slug=f"challenge-{uuid.uuid4().hex[:8]}",
        call_type=GrantCall.CallType.CHALLENGE,
        opens_at=timezone.now(),
        closes_at=timezone.now() + datetime.timedelta(days=30),
        status=GrantCall.Status.PUBLISHED,
        challenge_innovation_stage=GrantCall.InnovationStage.PROTOTYPE,
        challenge_sector_focus="agritech",
    )


@pytest.mark.django_db
def test_create_challenge_profile(applicant_user, institution):
    call = _challenge_call()
    app = Application.objects.create(call=call, applicant=applicant_user, institution=institution)
    profile = ChallengeApplicationProfile.objects.create(
        application=app,
        innovation_stage=GrantCall.InnovationStage.PROTOTYPE,
        problem_statement="Smallholder post-harvest loss",
        proposed_solution="Low-cost cold storage",
        team_size=4,
        prototype_status=ChallengeApplicationProfile.PrototypeStatus.WORKING_PROTOTYPE,
    )
    assert app.challenge_profile == profile
    assert profile.team_size == 4


@pytest.mark.django_db
def test_application_partners_multiple_per_application(applicant_user, institution):
    call = _challenge_call()
    app = Application.objects.create(call=call, applicant=applicant_user, institution=institution)
    ApplicationPartner.objects.create(
        application=app,
        organization_name="Partner Org A",
        contact_person="Jane Doe",
        email="jane@partnera.org",
        phone="+256700000000",
        address="Kampala, Uganda",
        area_of_expertise="Cold chain logistics",
    )
    ApplicationPartner.objects.create(
        application=app,
        organization_name="Partner Org B",
        contact_person="John Roe",
        email="john@partnerb.org",
        phone="+254700000000",
        address="Nairobi, Kenya",
        area_of_expertise="Agritech software",
    )
    assert app.partners.count() == 2
    names = set(app.partners.values_list("organization_name", flat=True))
    assert names == {"Partner Org A", "Partner Org B"}
