from django.contrib import admin

from apps.core.countries import get_country_name
from apps.rims.operations.models import (
    MOU,
    Donor,
    Member,
    MemberUniversity,
    Partner,
    ReminderConfig,
    RetentionPolicy,
    ReviewerProfile,
    VarianceAlertConfig,
)


@admin.register(Partner)
class PartnerAdmin(admin.ModelAdmin):
    list_display = ("name", "country_name", "contact_email", "created_at")
    search_fields = ("name", "contact_email")

    @admin.display(description="Country", ordering="country")
    def country_name(self, obj):
        return get_country_name(obj.country) or "—"


@admin.register(MOU)
class MOUAdmin(admin.ModelAdmin):
    list_display = ("title", "partner", "institution", "status", "signed_on")
    list_filter = ("status",)
    search_fields = ("title", "partner__name")


@admin.register(Member)
class MemberAdmin(admin.ModelAdmin):
    list_display = ("institution", "partner", "joined_on")
    autocomplete_fields = ("institution", "partner")


@admin.register(Donor)
class DonorAdmin(admin.ModelAdmin):
    list_display = ("name", "donor_type", "country_name", "contact_email", "created_at")
    list_filter = ("donor_type",)
    search_fields = ("name", "contact_email")
    autocomplete_fields = ("partner",)

    @admin.display(description="Country", ordering="country")
    def country_name(self, obj):
        return get_country_name(obj.country) or "—"


@admin.register(ReminderConfig)
class ReminderConfigAdmin(admin.ModelAdmin):
    list_display = (
        "id",
        "milestone_warn_days_before",
        "agreement_chase_grace_days",
        "agreement_chase_max_reminders",
        "closeout_warn_days_before",
        "updated_at",
    )

    def has_add_permission(self, request):
        # Singleton — ensure only one row by hiding "add" once it exists.
        return not ReminderConfig.objects.exists()


@admin.register(RetentionPolicy)
class RetentionPolicyAdmin(admin.ModelAdmin):
    list_display = ("funding_type", "retention_years", "archive_after_days", "updated_at")
    list_filter = ("funding_type",)


@admin.register(ReviewerProfile)
class ReviewerProfileAdmin(admin.ModelAdmin):
    list_display = ("user", "available", "max_concurrent_reviews", "updated_at")
    list_filter = ("available",)
    search_fields = ("user__email",)
    autocomplete_fields = ("user",)


@admin.register(VarianceAlertConfig)
class VarianceAlertConfigAdmin(admin.ModelAdmin):
    list_display = ("id", "enabled", "percent_threshold", "period_window_days", "updated_at")

    def has_add_permission(self, request):
        return not VarianceAlertConfig.objects.exists()


@admin.register(MemberUniversity)
class MemberUniversityAdmin(admin.ModelAdmin):
    list_display = (
        "institution", "membership_status", "membership_number",
        "focal_person_name", "focal_person_email", "annual_fee_paid",
    )
    list_filter = ("membership_status", "annual_fee_paid")
    search_fields = ("institution__name", "membership_number", "focal_person_name", "focal_person_email")
