"""PRD §5.1 FRFA-GPS006 — strategic objective taxonomy."""
from datetime import date, timedelta

import pytest
from django.db import IntegrityError

from apps.rims.grants.models import FundingRecord, StrategicObjective
from apps.rims.grants.services import split_strategic_objectives


@pytest.mark.django_db
def test_funding_record_m2m_strategic_objectives():
    a = StrategicObjective.objects.create(name="Food Security", slug="food-security")
    b = StrategicObjective.objects.create(name="Youth Innovation", slug="youth-innovation")
    fr = FundingRecord.objects.create(
        title="FR",
        amount="1000",
        start_date=date.today(),
        end_date=date.today() + timedelta(days=30),
    )
    fr.strategic_objective_refs.add(a, b)
    fr.refresh_from_db()
    assert set(fr.strategic_objective_refs.values_list("slug", flat=True)) == {
        "food-security",
        "youth-innovation",
    }


@pytest.mark.django_db
def test_duplicate_strategic_objective_names_rejected():
    StrategicObjective.objects.create(name="X", slug="x")
    with pytest.raises(IntegrityError):
        StrategicObjective.objects.create(name="X", slug="x-2")


def test_split_strategic_objectives_handles_common_separators():
    text = "Food Security, youth innovation; Climate Resilience\nFood Security"
    parts = split_strategic_objectives(text)
    # Last duplicate dropped, others preserved in first-seen order.
    assert parts == ["Food Security", "youth innovation", "Climate Resilience"]


def test_split_strategic_objectives_empty_input():
    assert split_strategic_objectives("") == []
    assert split_strategic_objectives(None) == []


def test_split_strategic_objectives_strips_whitespace():
    assert split_strategic_objectives("  a ,  b,c  ") == ["a", "b", "c"]
