"""
Tenant Admin — Full enterprise admin panel for tenant management.
"""
from django.contrib import admin
from django.utils.html import format_html
from django.utils import timezone

from .models import (
    Tenant,
    Domain,
    TenantSettings,
    TenantQuotaUsage,
    TenantStatus,
)


# ─── Inlines ─────────────────────────────────────────────────────────────


class DomainInline(admin.TabularInline):
    model = Domain
    extra = 0
    fields = ["domain", "is_primary", "ssl_enabled"]


class TenantSettingsInline(admin.StackedInline):
    model = TenantSettings
    extra = 0
    fieldsets = (
        ("Feature Flags", {"fields": ("feature_flags",), "classes": ("collapse",)}),
        ("Security Policy", {"fields": ("security_policy",), "classes": ("collapse",)}),
        ("Branding / White-label", {"fields": ("branding",), "classes": ("collapse",)}),
        ("Localization", {"fields": ("localization",), "classes": ("collapse",)}),
        ("Integration Keys", {"fields": ("integration_keys",), "classes": ("collapse",)}),
    )


class TenantQuotaUsageInline(admin.StackedInline):
    model = TenantQuotaUsage
    extra = 0
    readonly_fields = [
        "users_count",
        "storage_usage_mb",
        "api_calls",
        "projects_count",
        "records_count",
        "last_calculated_at",
        "usage_summary",
    ]
    fields = readonly_fields

    def usage_summary(self, obj):
        if not obj.pk:
            return "—"
        return format_html(
            "<b>Users:</b> {} / {} ({}%) &nbsp; | &nbsp; "
            "<b>Storage:</b> {} MB / {} MB ({}%)",
            obj.users_count,
            obj.tenant.max_users,
            obj.users_percent,
            round(obj.storage_usage_mb, 1),
            obj.tenant.max_storage_mb,
            obj.storage_percent,
        )

    usage_summary.short_description = "Resource Summary"


# ─── Tenant Admin ────────────────────────────────────────────────────────


@admin.register(Tenant)
class TenantAdmin(admin.ModelAdmin):
    list_display = [
        "name",
        "slug",
        "type",
        "status_badge",
        "subscription_plan",
        "max_users",
        "country",
        "parent_tenant",
        "created_at",
    ]
    list_filter = ["status", "type", "is_active", "country", "isolation_type"]
    search_fields = ["name", "slug", "legal_name"]
    readonly_fields = ["created_at", "updated_at", "activated_at", "suspended_at"]
    prepopulated_fields = {"slug": ("name",)}
    autocomplete_fields = ["parent_tenant"]
    raw_id_fields = ["owner"]
    list_per_page = 25
    actions = ["activate_tenants", "suspend_tenants", "archive_tenants"]

    fieldsets = (
        (
            None,
            {"fields": ("name", "legal_name", "slug", "type", "status", "is_active", "owner")},
        ),
        (
            "Hierarchy",
            {"fields": ("parent_tenant",), "classes": ("collapse",)},
        ),
        (
            "Subscription & Limits",
            {"fields": ("subscription_plan", "max_users", "max_storage_mb")},
        ),
        (
            "Localisation",
            {
                "fields": ("country", "default_language", "timezone", "currency"),
                "classes": ("collapse",),
            },
        ),
        (
            "Isolation",
            {"fields": ("isolation_type",), "classes": ("collapse",)},
        ),
        (
            "Extra Data",
            {"fields": ("metadata", "settings"), "classes": ("collapse",)},
        ),
        (
            "Lifecycle Timestamps",
            {
                "fields": ("created_at", "updated_at", "activated_at", "suspended_at"),
                "classes": ("collapse",),
            },
        ),
    )

    inlines = [DomainInline, TenantSettingsInline, TenantQuotaUsageInline]

    # ── Badges ────────────────────────────────────────────────────

    def status_badge(self, obj):
        colours = {
            TenantStatus.ACTIVE: "#22c55e",
            TenantStatus.PENDING: "#eab308",
            TenantStatus.SUSPENDED: "#f97316",
            TenantStatus.ARCHIVED: "#6b7280",
        }
        colour = colours.get(obj.status, "#6b7280")
        return format_html(
            '<span style="padding:3px 8px;border-radius:4px;'
            'background:{};color:#fff;font-size:11px">{}</span>',
            colour,
            obj.get_status_display(),
        )

    status_badge.short_description = "Status"
    status_badge.admin_order_field = "status"

    # ── Bulk actions ──────────────────────────────────────────────

    @admin.action(description="Activate selected tenants")
    def activate_tenants(self, request, queryset):
        for t in queryset:
            t.activate()
        self.message_user(request, f"{queryset.count()} tenant(s) activated.")

    @admin.action(description="Suspend selected tenants")
    def suspend_tenants(self, request, queryset):
        for t in queryset:
            t.suspend()
        self.message_user(request, f"{queryset.count()} tenant(s) suspended.")

    @admin.action(description="Archive selected tenants")
    def archive_tenants(self, request, queryset):
        for t in queryset:
            t.archive()
        self.message_user(request, f"{queryset.count()} tenant(s) archived.")


@admin.register(Domain)
class DomainAdmin(admin.ModelAdmin):
    list_display = ["domain", "tenant", "is_primary", "ssl_enabled"]
    list_filter = ["is_primary", "ssl_enabled"]
    search_fields = ["domain"]


@admin.register(TenantSettings)
class TenantSettingsAdmin(admin.ModelAdmin):
    list_display = ["tenant", "updated_at"]
    search_fields = ["tenant__name"]


@admin.register(TenantQuotaUsage)
class TenantQuotaUsageAdmin(admin.ModelAdmin):
    list_display = [
        "tenant",
        "users_count",
        "storage_usage_mb",
        "api_calls",
        "last_calculated_at",
    ]
    search_fields = ["tenant__name"]
    readonly_fields = [
        "users_count",
        "storage_usage_mb",
        "api_calls",
        "projects_count",
        "records_count",
        "last_calculated_at",
    ]
