from __future__ import annotations

from typing import ClassVar

from django.contrib import admin
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _

try:
    from unfold.admin import ModelAdmin as UnfoldModelAdmin, TabularInline as UnfoldTabularInline  # isort: skip
    from unfold.decorators import display  # isort: skip
except ImportError:
    UnfoldModelAdmin = admin.ModelAdmin  # type: ignore[assignment]
    UnfoldTabularInline = admin.TabularInline  # type: ignore[assignment]

    def display(**kwargs):  # type: ignore[return-value]
        def decorator(fn):
            return fn
        return decorator

from simorgh.apps.modules.models import (  # isort: skip
    Capability,
    Domain,
    FeatureCatalog,
    FeatureEntitlement,
    ModuleCatalog,
    TenantFeatureOverride,
    TenantModule,
)

# ---------------------------------------------------------------------------
# Domain (Phase A)
# ---------------------------------------------------------------------------


@admin.register(Domain)
class DomainAdmin(UnfoldModelAdmin):
    list_display = ("name", "code", "sort_order", "created_at")
    list_filter = ("sort_order",)
    search_fields = ("name", "code", "description")
    readonly_fields = ("public_id", "created_at", "updated_at")
    ordering = ("sort_order", "code")
    fieldsets = (
        (_("شناسه"), {"fields": ("code", "name", "sort_order", "description")}),
        (_("متادیتا"), {"fields": ("public_id", "created_at", "updated_at"), "classes": ("collapse",)}),
    )


# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------


# ---------------------------------------------------------------------------
# Capability (Phase A)
# ---------------------------------------------------------------------------


@admin.register(Capability)
class CapabilityAdmin(UnfoldModelAdmin):
    list_display = (
        "name", "slug", "domain", "module_name", "icon", "sort_order",
        "capability_feature_count", "created_at",
    )
    list_filter = ("domain", "sort_order")
    search_fields = ("name", "slug", "module_name", "description")
    readonly_fields = ("public_id", "created_at", "updated_at")
    prepopulated_fields: ClassVar[dict[str, tuple[str, ...]]] = {"slug": ("name",)}
    autocomplete_fields = ("domain",)
    ordering = ("sort_order", "name")
    fieldsets = (
        (_("شناسه"), {"fields": ("name", "slug", "domain", "module_name", "icon", "sort_order", "description")}),
        (_("متادیتا"), {"fields": ("public_id", "created_at", "updated_at"), "classes": ("collapse",)}),
    )

    @display(description=_("Features"))
    def capability_feature_count(self, obj: Capability) -> int:
        return obj.features.count()


# ---------------------------------------------------------------------------
# Feature
# ---------------------------------------------------------------------------

@admin.register(FeatureCatalog)
class FeatureCatalogAdmin(UnfoldModelAdmin):
    list_display = (
        "code", "module_name", "capability_name",
        "always_on_icon", "platform_internal_icon", "description_short", "created_at",
    )
    list_filter = ("capability", "module_name", "is_always_on", "is_platform_internal")
    search_fields = ("code", "label", "description")
    readonly_fields = ("public_id", "created_at", "updated_at")
    ordering = ("module_name", "code")
    autocomplete_fields = ("capability",)
    fieldsets = (
        (_("شناسه"), {"fields": ("code", "label", "module_name", "capability", "description")}),
        (_("لایسنسینگ"), {"fields": ("is_always_on", "is_platform_internal")}),
        (_("متادیتا"), {"fields": ("public_id", "created_at", "updated_at"), "classes": ("collapse",)}),
    )

    @display(description=_("Capability"))
    def capability_name(self, obj: FeatureCatalog) -> str:
        return obj.capability.name if obj.capability else "—"

    @display(description=_("Always On"), boolean=True)
    def always_on_icon(self, obj: FeatureCatalog) -> bool:
        return obj.is_always_on

    @display(description=_("Internal"), boolean=True)
    def platform_internal_icon(self, obj: FeatureCatalog) -> bool:
        return obj.is_platform_internal

    @display(description=_("Description"))
    def description_short(self, obj: FeatureCatalog) -> str:
        return obj.description[:80] + "…" if len(obj.description) > 80 else obj.description


# ---------------------------------------------------------------------------
# FeatureFlag (inline + standalone)
# ---------------------------------------------------------------------------


@admin.register(TenantFeatureOverride)
class TenantFeatureOverrideAdmin(UnfoldModelAdmin):
    list_display = ("feature_key", "enabled_badge", "user", "tenant", "created_at")
    list_filter = ("enabled", "tenant")
    search_fields = ("feature_key",)
    readonly_fields = ("public_id", "created_at", "updated_at")
    autocomplete_fields = ("user",)
    fieldsets = (
        (_("Override"), {"fields": ("tenant", "organization_node", "feature_key", "enabled", "user")}),
        (_('متادیتا'), {"fields": ("public_id", "created_at", "updated_at"), "classes": ("collapse",)}),
    )

    @display(description=_("Enabled"))
    def enabled_badge(self, obj: TenantFeatureOverride) -> str:
        if obj.enabled:
            return format_html('<span style="background:#22c55e;color:#fff;padding:2px 8px;border-radius:4px;font-size:11px">✓ فعال</span>')
        return format_html('<span style="background:#ef4444;color:#fff;padding:2px 8px;border-radius:4px;font-size:11px">✗ غیرفعال</span>')


# ---------------------------------------------------------------------------
# Module (per-tenant installation)
# ---------------------------------------------------------------------------

@admin.register(TenantModule)
class TenantModuleAdmin(UnfoldModelAdmin):
    list_display = (
        "name", "version", "status_badge", "tenant",
        "installed_at", "enabled_at",
    )
    list_filter = ("status", "tenant")
    search_fields = ("name",)
    readonly_fields = (
        "public_id", "installed_at", "enabled_at", "disabled_at",
        "created_at", "updated_at",
    )
    ordering = ("tenant", "name")

    @display(description=_("Status"))
    def status_badge(self, obj: TenantModule) -> str:
        colours = {
            "enabled": "#22c55e",
            "installed": "#3b82f6",
            "disabled": "#f59e0b",
            "uninstalled": "#ef4444",
        }
        colour = colours.get(obj.status, "#6b7280")
        return format_html(
            '<span style="background:{};color:#fff;padding:2px 8px;border-radius:4px;font-size:11px">{}</span>',
            colour,
            obj.status,
        )


# ---------------------------------------------------------------------------
# ModuleCatalog (global manifest mirror)
# ---------------------------------------------------------------------------

@admin.register(ModuleCatalog)
class ModuleCatalogAdmin(UnfoldModelAdmin):
    list_display = (
        "name", "version", "domain_badge",
        "depends_count", "features_count", "flags_count",
        "perms_count", "events_count",
        "created_at",
    )
    list_filter = ("domain",)
    search_fields = ("name", "label", "description")
    readonly_fields = (
        "public_id", "created_at", "updated_at",
        "depends_on", "permissions", "events", "feature_flags",
    )
    autocomplete_fields = ("domain",)
    fieldsets = (
        (
            _("Identity"),
            {"fields": ("name", "version", "domain", "label", "description")},
        ),
        (
            _("Dependencies & Permissions"),
            {"fields": ("depends_on", "permissions", "events", "feature_flags")},
        ),
        (
            _("Metadata"),
            {"fields": ("public_id", "created_at", "updated_at"), "classes": ("collapse",)},
        ),
    )

    @display(description=_("Domain"))
    def domain_badge(self, obj: ModuleCatalog) -> str:
        if obj.domain_id is None:
            return "—"
        return obj.domain.name

    @display(description=_("Deps"))
    def depends_count(self, obj: ModuleCatalog) -> int:
        return len(obj.depends_on) if obj.depends_on else 0

    @display(description=_("Features"))
    def features_count(self, obj: ModuleCatalog) -> int:
        return FeatureCatalog.objects.filter(module_name=obj.name).count()

    @display(description=_("Flags"))
    def flags_count(self, obj: ModuleCatalog) -> int:
        return len(obj.feature_flags) if obj.feature_flags else 0

    @display(description=_("Perms"))
    def perms_count(self, obj: ModuleCatalog) -> int:
        return len(obj.permissions) if obj.permissions else 0

    @display(description=_("Events"))
    def events_count(self, obj: ModuleCatalog) -> int:
        return len(obj.events) if obj.events else 0


# ---------------------------------------------------------------------------
# FeatureEntitlement
# ---------------------------------------------------------------------------

@admin.register(FeatureEntitlement)
class FeatureEntitlementAdmin(UnfoldModelAdmin):
    list_display = (
        "feature_key", "source_badge",
        "enabled", "user", "tenant", "expires_at",
    )
    list_filter = ("source", "enabled", "tenant")
    search_fields = ("feature_key",)
    readonly_fields = ("public_id", "created_at", "updated_at", "revoked_at")
    autocomplete_fields = ("user",)
    fieldsets = (
        (
            _("Entitlement"),
            {
                "fields": (
                    "tenant", "organization_node",
                    "feature_key", "user", "source",
                ),
                "description": _(
                    "Grant a feature to a tenant (or a specific user). "
                    "feature_key: dotted key, e.g. 'crm.pipeline'.",
                ),
            },
        ),
        (
            _("Validity"),
            {"fields": ("enabled", "starts_at", "expires_at", "metadata")},
        ),
        (
            _("Metadata"),
            {"fields": ("public_id", "revoked_at", "created_at", "updated_at"), "classes": ("collapse",)},
        ),
    )

    @display(description=_("Source"))
    def source_badge(self, obj: FeatureEntitlement) -> str:
        colours = {
            "included": "#22c55e",
            "purchased": "#3b82f6",
            "trial": "#f59e0b",
            "granted": "#a855f7",
        }
        colour = colours.get(obj.source, "#6b7280")
        return format_html(
            '<span style="background:{};color:#fff;padding:2px 8px;border-radius:4px;font-size:11px">{}</span>',
            colour,
            obj.source,
        )
