import pytest
from django.urls import reverse

from apps.core.authentication.models import Institution
from apps.core.permissions.roles import UserRole
from apps.rims.operations.forms import InstitutionForm, PartnerForm
from apps.rims.operations.models import Partner


@pytest.mark.django_db
def test_partner_form_normalizes_lowercase_country():
    form = PartnerForm(
        data={
            "name": "Alliance for Soil Health",
            "partner_type": Partner.PartnerType.NGO,
            "country": "ug",
            "contact_email": "ally@example.com",
            "website": "",
            "notes": "",
        }
    )

    assert form.is_valid(), form.errors
    partner = form.save()
    assert partner.country == "Uganda"


@pytest.mark.django_db
def test_institution_form_rejects_invalid_country_code():
    form = InstitutionForm(
        data={
            "name": "Outside Network University",
            "country": "QQ",
            "institution_type": Institution.InstitutionType.UNIVERSITY,
            "region": "",
            "website": "",
            "address": "",
            "is_member": "",
            "is_active": "on",
        }
    )

    assert not form.is_valid()
    assert "country" in form.errors


@pytest.mark.django_db
def test_institution_form_accepts_non_ruforum_iso_country():
    form = InstitutionForm(
        data={
            "name": "MIT",
            "country": "US",
            "institution_type": Institution.InstitutionType.UNIVERSITY,
            "region": "",
            "website": "",
            "address": "",
            "is_member": "",
            "is_active": "on",
        }
    )

    assert form.is_valid(), form.errors
    institution = form.save()
    assert institution.country == "United States"


@pytest.mark.django_db
def test_partner_create_view_saves_normalized_country_and_renders_country_name(client, django_user_model):
    manager = django_user_model.objects.create_user(
        email="manager@example.com",
        password="pw",
        role=UserRole.GRANTS_MANAGER,
    )
    client.force_login(manager)

    response = client.post(
        reverse("rims_operations:partner_create"),
        {
            "name": "Regional Innovation Hub",
            "partner_type": Partner.PartnerType.FUNDER,
            "country": "ke",
            "contact_email": "regional@example.com",
            "website": "",
            "notes": "",
        },
    )

    assert response.status_code == 302
    partner = Partner.objects.get(name="Regional Innovation Hub")
    assert partner.country == "Kenya"

    detail = client.get(reverse("rims_operations:partner_detail", kwargs={"pk": partner.pk}))
    assert detail.status_code == 200
    assert b"Kenya" in detail.content


@pytest.mark.django_db
def test_institution_edit_view_updates_normalized_country_and_renders_country_name(client, django_user_model):
    manager = django_user_model.objects.create_user(
        email="ops@example.com",
        password="pw",
        role=UserRole.GRANTS_MANAGER,
    )
    institution = Institution.objects.create(name="Makerere Test", country="Uganda", is_member=True)
    client.force_login(manager)

    response = client.post(
        reverse("rims_operations:institution_edit", kwargs={"pk": institution.pk}),
        {
            "name": institution.name,
            "country": "tz",
            "institution_type": Institution.InstitutionType.UNIVERSITY,
            "region": "East Africa",
            "website": "",
            "address": "",
            "is_member": "on",
            "is_active": "on",
        },
    )

    assert response.status_code == 302
    institution.refresh_from_db()
    assert institution.country == "Tanzania, United Republic of"

    detail = client.get(reverse("rims_operations:institution_detail", kwargs={"pk": institution.pk}))
    assert detail.status_code == 200
    assert b"Tanzania" in detail.content
