from __future__ import annotations

from django import forms
from django.contrib import admin

try:
    from unfold.admin import (
        ModelAdmin as UnfoldModelAdmin,
        TabularInline as UnfoldTabularInline,
    )
except ImportError:
    UnfoldModelAdmin = admin.ModelAdmin  # type: ignore[assignment]
    UnfoldTabularInline = admin.TabularInline  # type: ignore[assignment]

from simorgh.apps.memberships.models import Membership
from simorgh.apps.organizations.models import OrganizationNode


class MembershipInlineForm(forms.ModelForm):
    """Custom form that makes tenant optional — it's auto-set from the parent org node."""

    class Meta:
        model = Membership
        fields = "__all__"

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["tenant"].required = False
        self.fields["tenant"].widget = forms.HiddenInput()


class MembershipInline(UnfoldTabularInline):
    model = Membership
    form = MembershipInlineForm
    fk_name = "organization_node"
    extra = 0
    fields = ("role", "status", "users_count")
    readonly_fields = ("users_count",)
    autocomplete_fields = ("role",)
    verbose_name = "عضویت"
    verbose_name_plural = "عضویت‌ها"
    show_change_link = True

    @admin.display(description="تعداد کاربران")
    def users_count(self, obj):
        return obj.users.count()


@admin.register(OrganizationNode)
class OrganizationNodeAdmin(UnfoldModelAdmin):
    list_display = ("name", "tenant", "type", "path_string", "depth", "is_active")
    list_filter = ("tenant", "type", "is_active")
    search_fields = ("name", "code", "path_string")
    readonly_fields = ("public_id", "path_string", "depth", "created_at", "updated_at")
    inlines = (MembershipInline,)
    fieldsets = (
        (None, {
            "fields": ("tenant", "parent", "type", "name", "code", "is_active"),
        }),
        ("متادیتا", {
            "fields": ("public_id", "path_string", "depth", "created_at", "updated_at"),
            "classes": ("collapse",),
        }),
    )

    def save_formset(self, request, form, formset, change):
        """Auto-populate tenant on membership inlines from the parent org node."""
        instances = formset.save(commit=False)
        for obj in instances:
            if isinstance(obj, Membership) and not obj.tenant_id:
                obj.tenant = form.instance.tenant
            obj.save()
        formset.save_m2m()
