"""PRD §5.1 FRFA-GPS007–009 — donor model + duplicate detection."""
import pytest
from django.db import IntegrityError

from apps.rims.operations.models import Donor
from apps.rims.operations.services import find_duplicate_donor


@pytest.mark.django_db
def test_find_duplicate_donor_case_insensitive_name_match():
    Donor.objects.create(name="Gates Foundation", country="United States")
    assert find_duplicate_donor("gates foundation", "US") is not None
    assert find_duplicate_donor("GATES FOUNDATION", "us") is not None


@pytest.mark.django_db
def test_find_duplicate_donor_country_discriminates():
    """Two national offices of the same parent are distinct entries."""
    us_office = Donor.objects.create(name="World Bank", country="United States")
    ug_office = Donor.objects.create(name="World Bank", country="Uganda")
    assert find_duplicate_donor("World Bank", "US").pk == us_office.pk
    assert find_duplicate_donor("World Bank", "UG").pk == ug_office.pk


@pytest.mark.django_db
def test_find_duplicate_donor_returns_none_when_no_match():
    Donor.objects.create(name="Known Donor", country="Uganda")
    assert find_duplicate_donor("Unknown Donor", "UG") is None


@pytest.mark.django_db
def test_db_uniqueness_constraint_prevents_duplicate_name_country():
    Donor.objects.create(name="ACME", country="Uganda")
    with pytest.raises(IntegrityError):
        Donor.objects.create(name="ACME", country="Uganda")


@pytest.mark.django_db
def test_funding_record_can_link_to_donor():
    from datetime import date, timedelta
    from apps.rims.grants.models import FundingRecord

    donor = Donor.objects.create(name="Main Donor", country="Uganda")
    fr = FundingRecord.objects.create(
        title="FR test",
        amount="1000",
        start_date=date.today(),
        end_date=date.today() + timedelta(days=90),
        donor=donor,
    )
    fr.refresh_from_db()
    assert fr.donor_id == donor.pk
