from django import forms

from apps.core.countries import CountryChoiceField
from apps.core.authentication.models import Institution
from apps.rims.grants.models import StrategicObjective
from apps.rims.operations.models import MOU, Donor, Partner
from apps.rims.operations.services import find_duplicate_donor


class PartnerForm(forms.ModelForm):
    country = CountryChoiceField(required=False)

    class Meta:
        model = Partner
        fields = ["name", "partner_type", "country", "contact_email", "website", "logo", "notes"]
        widgets = {
            "notes": forms.Textarea(attrs={"rows": 4}),
        }


class InstitutionForm(forms.ModelForm):
    country = CountryChoiceField(required=False)

    class Meta:
        model = Institution
        fields = [
            "name",
            "country",
            "institution_type",
            "region",
            "website",
            "address",
            "logo",
            "is_member",
            "is_active",
        ]
        widgets = {
            "address": forms.Textarea(attrs={"rows": 3}),
        }


class MOUForm(forms.ModelForm):
    class Meta:
        model = MOU
        fields = [
            "partner",
            "institution",
            "title",
            "status",
            "signed_on",
            "expires_on",
            "document",
        ]
        widgets = {
            "signed_on": forms.DateInput(attrs={"type": "date"}),
            "expires_on": forms.DateInput(attrs={"type": "date"}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["institution"].queryset = Institution.objects.filter(is_active=True).order_by("name")
        self.fields["institution"].required = False


class DonorForm(forms.ModelForm):
    """PRD §5.1 FRFA-GPS007/008/009 — donor profile capture with duplicate
    detection. The form surfaces a non-blocking warning when a near-match
    exists; users can proceed by re-submitting with confirm=1 in POST data
    so the duplicate is consciously accepted.
    """

    country = CountryChoiceField(required=False)

    class Meta:
        model = Donor
        fields = [
            "name",
            "donor_type",
            "country",
            "contact_email",
            "contact_phone",
            "website",
            "partner",
            "notes",
        ]
        widgets = {
            "notes": forms.Textarea(attrs={"rows": 3}),
        }

    def __init__(self, *args, confirm_duplicate: bool = False, **kwargs):
        super().__init__(*args, **kwargs)
        self.confirm_duplicate = confirm_duplicate
        self.duplicate_match: Donor | None = None

    def clean(self):
        cleaned = super().clean()
        name = (cleaned.get("name") or "").strip()
        country = (cleaned.get("country") or "").strip()
        if not name:
            return cleaned
        existing = find_duplicate_donor(name=name, country=country)
        if existing and existing.pk != getattr(self.instance, "pk", None):
            self.duplicate_match = existing
            if not self.confirm_duplicate:
                self.add_error(
                    "name",
                    (
                        f"A donor with a matching name already exists "
                        f"({existing.name} · {existing.country or 'no country'}). "
                        "Re-submit with the duplicate checkbox to confirm you want a new record."
                    ),
                )
        return cleaned


class StrategicObjectiveForm(forms.ModelForm):
    """PRD §5.1 FRFA-GPS006 — admin curation of the strategic objective list."""

    class Meta:
        model = StrategicObjective
        fields = ["name", "slug", "description", "active"]
        widgets = {
            "description": forms.Textarea(attrs={"rows": 3}),
        }
