from __future__ import annotations

from django.contrib import admin
from django.utils.translation import gettext_lazy as _

try:
    from unfold.admin import ModelAdmin as UnfoldModelAdmin
except ImportError:
    UnfoldModelAdmin = admin.ModelAdmin  # type: ignore[assignment]

from simorgh.apps.workspaces.models import (
    NavigationItem,
    UserOrgContextPreference,
    UserWorkspacePreference,
    Workspace,
    WorkspaceAccessGrant,
    WorkspaceMembership,
    WorkspaceTemplate,
)


class WorkspaceAccessGrantInline(admin.TabularInline):
    model = WorkspaceAccessGrant
    extra = 1
    fields = ("role",)
    autocomplete_fields = ("role",)
    verbose_name = "Access Grant"
    verbose_name_plural = "Access Grants"


@admin.register(Workspace)
class WorkspaceAdmin(UnfoldModelAdmin):
    list_display = ("slug", "name", "kind", "tenant", "is_active", "created_at")
    list_filter = ("kind", "is_active", "tenant")
    search_fields = ("slug", "name")
    readonly_fields = ("public_id", "created_at", "updated_at")
    inlines = [WorkspaceAccessGrantInline]

    def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)
        for obj in instances:
            if isinstance(obj, WorkspaceAccessGrant):
                parent_ws = form.instance
                if not obj.tenant_id:
                    obj.tenant = parent_ws.tenant
                if not obj.organization_node_id:
                    obj.organization_node = parent_ws.organization_node
                obj.save()
        formset.save_m2m()
        for obj in formset.deleted_objects:
            obj.delete()


@admin.register(WorkspaceMembership)
class WorkspaceMembershipAdmin(UnfoldModelAdmin):
    list_display = ("workspace", "user", "tenant", "created_at")
    list_filter = ("workspace", "tenant")
    search_fields = ("user__email", "workspace__slug")
    readonly_fields = ("public_id", "created_at", "updated_at")


@admin.register(NavigationItem)
class NavigationItemAdmin(UnfoldModelAdmin):
    list_display = ("key", "label_key", "workspace", "module", "order", "permission")
    list_filter = ("workspace", "module")
    search_fields = ("key", "label_key", "route")
    readonly_fields = ("public_id", "created_at", "updated_at")
    fieldsets = (
        (
            _("Identity"),
            {
                "fields": ("workspace", "parent", "key", "label_key", "icon", "order"),
                "description": _(
                    "key: unique identifier (e.g. 'crm.contacts'). "
                    "label_key: i18n translation key shown in the sidebar (e.g. 'nav.crm.contacts'). "
                    "route: frontend URL path (e.g. '/crm/contacts')."
                ),
            },
        ),
        (
            _("Navigation target"),
            {"fields": ("route", "module")},
        ),
        (
            _("Access control"),
            {
                "fields": ("permission",),
                "description": _(
                    "permission: IAM permission codename required to see this item. "
                    "Phase B: feature gating removed — navigations are permission-gated only."
                ),
            },
        ),
        (
            _("Metadata"),
            {"fields": ("public_id", "created_at", "updated_at"), "classes": ("collapse",)},
        ),
    )


@admin.register(WorkspaceTemplate)
class WorkspaceTemplateAdmin(UnfoldModelAdmin):
    list_display = ("name", "slug", "is_system", "kind", "created_at")
    list_filter = ("kind", "is_system")
    search_fields = ("name", "slug")
    readonly_fields = ("public_id", "created_at", "updated_at")
    ordering = ("name",)


@admin.register(WorkspaceAccessGrant)
class WorkspaceAccessGrantAdmin(UnfoldModelAdmin):
    list_display = ("workspace", "role", "tenant", "created_at")
    list_filter = ("workspace", "tenant")
    search_fields = ("role__name", "workspace__slug")
    readonly_fields = ("public_id", "created_at", "updated_at")
    ordering = ("-created_at",)


@admin.register(UserOrgContextPreference)
class UserOrgContextPreferenceAdmin(UnfoldModelAdmin):
    list_display = ("user", "tenant", "active_organization_node", "created_at")
    list_filter = ("tenant",)
    search_fields = ("user__username", "tenant__name")
    readonly_fields = ("public_id", "created_at", "updated_at")
    ordering = ("-created_at",)


@admin.register(UserWorkspacePreference)
class UserWorkspacePreferenceAdmin(UnfoldModelAdmin):
    list_display = ("user", "tenant", "active_workspace", "created_at")
    list_filter = ("tenant",)
    search_fields = ("user__username", "tenant__name")
    readonly_fields = ("public_id", "created_at", "updated_at")
    ordering = ("-created_at",)
