from django.contrib import admin
from django.utils import timezone

from licenses.models import License, Installation, LicenseValidation, LicenseCapability


class LicenseCapabilityInline(admin.TabularInline):
    model = LicenseCapability
    extra = 0
    fields = ["key", "value"]


@admin.register(License)
class LicenseAdmin(admin.ModelAdmin):
    list_display = [
        "license_key",
        "client",
        "license_type",
        "demo_mode",
        "status",
        "max_users",
        "expires_at",
        "created_at",
    ]
    list_filter = ["license_type", "status", "demo_mode"]
    search_fields = ["license_key", "client__name", "client__trade_name"]
    readonly_fields = ["id", "license_key", "created_at", "updated_at"]
    raw_id_fields = ["client"]
    inlines = [LicenseCapabilityInline]
    fieldsets = (
        (None, {"fields": ("id", "license_key", "client")}),
        ("Configuración", {"fields": ("license_type", "demo_mode", "max_users", "status")}),
        ("Fechas", {"fields": ("activated_at", "expires_at")}),
        ("Metadatos", {"fields": ("notes", "created_at", "updated_at")}),
    )
    actions = ["activate_licenses", "deactivate_licenses", "suspend_licenses"]

    @admin.action(description="Activar licencias seleccionadas")
    def activate_licenses(self, request, queryset):
        count = 0
        for license_obj in queryset:
            license_obj.activate()
            count += 1
        self.message_user(request, f"{count} licencia(s) activada(s).")

    @admin.action(description="Desactivar licencias seleccionadas")
    def deactivate_licenses(self, request, queryset):
        count = 0
        for license_obj in queryset:
            license_obj.deactivate()
            count += 1
        self.message_user(request, f"{count} licencia(s) desactivada(s).")

    @admin.action(description="Suspender licencias seleccionadas")
    def suspend_licenses(self, request, queryset):
        count = 0
        for license_obj in queryset:
            license_obj.suspend()
            count += 1
        self.message_user(request, f"{count} licencia(s) suspendida(s).")


@admin.register(Installation)
class InstallationAdmin(admin.ModelAdmin):
    list_display = [
        "installation_id",
        "license",
        "license_type_display",
        "demo_mode_display",
        "domain",
        "status",
        "probalis_version",
        "last_validated_at",
        "registered_at",
    ]
    list_filter = ["status", "license__license_type", "license__demo_mode"]
    search_fields = ["installation_id", "domain", "license__license_key"]
    readonly_fields = [
        "id",
        "installation_id",
        "installation_secret",
        "registered_at",
    ]
    raw_id_fields = ["license"]
    list_select_related = ["license"]
    fieldsets = (
        (None, {"fields": ("id", "installation_id", "installation_secret")}),
        ("Asociación", {"fields": ("license", "domain")}),
        ("Estado", {"fields": ("status", "last_validated_at")}),
        ("Técnico", {"fields": ("probalis_version", "ip_address")}),
        ("Metadatos", {"fields": ("notes", "registered_at")}),
    )

    def license_type_display(self, obj):
        return obj.license.get_license_type_display()
    license_type_display.short_description = "Tipo licencia"

    def demo_mode_display(self, obj):
        return "ON" if obj.license.demo_mode else "OFF"
    demo_mode_display.short_description = "Modo DEMO"

    def get_readonly_fields(self, request, obj=None):
        base = list(self.readonly_fields)
        if obj:
            base.append("installation_secret")
        return base


@admin.register(LicenseValidation)
class LicenseValidationAdmin(admin.ModelAdmin):
    list_display = [
        "validated_at",
        "result",
        "rejection_reason",
        "installation",
        "license_key_used",
        "domain_used",
        "ip_address",
        "probalis_version",
    ]
    list_filter = ["result", "rejection_reason"]
    search_fields = [
        "license_key_used",
        "installation_id_used",
        "domain_used",
        "ip_address",
    ]
    readonly_fields = [
        "id",
        "installation",
        "validated_at",
        "result",
        "rejection_reason",
        "ip_address",
        "probalis_version",
        "license_key_used",
        "installation_id_used",
        "domain_used",
        "user_agent",
    ]
    date_hierarchy = "validated_at"
    list_select_related = ["installation"]
