"""
Panel de administracion.

La auditoria se registra en modo consulta: el admin es una via de escritura
muy potente y estos registros pierden su valor si se pueden editar a mano.
"""

from django.contrib import admin
from django.utils.html import format_html

from notifications.models.event import NotificationEvent
from notifications.models.message import NotificationMessage
from notifications.models.notifications import Notifications
from notifications.models.numbers import Numbers


@admin.register(Notifications)
class NotificationsAdmin(admin.ModelAdmin):
    """Historico congelado. La auditoria viva es `NotificationMessage`."""

    list_display = ("to", "type", "body", "status", "updated_at", "created_at")
    list_filter = ("type", "status")
    search_fields = ("body",)

    def has_add_permission(self, request) -> bool:
        return False

    def has_change_permission(self, request, obj=None) -> bool:
        return False


@admin.register(Numbers)
class NumbersAdmin(admin.ModelAdmin):
    list_display = ("number", "replay_date")
    search_fields = ("number",)


class NotificationEventInline(admin.TabularInline):
    model = NotificationEvent
    extra = 0
    can_delete = False
    fields = ("event", "recipient", "occurred_at", "reason", "status_code")
    readonly_fields = fields

    def has_add_permission(self, request, obj=None) -> bool:
        return False


@admin.register(NotificationMessage)
class NotificationMessageAdmin(admin.ModelAdmin):
    list_display = (
        "id",
        "channel",
        "estado_coloreado",
        "provider",
        "sender",
        "destinatarios",
        "subject",
        "created_at",
    )
    list_filter = ("channel", "status", "provider", "created_at")
    search_fields = ("id", "subject", "sender", "provider_message_id", "request_id")
    date_hierarchy = "created_at"
    inlines = (NotificationEventInline,)

    @admin.display(description="Estado")
    def estado_coloreado(self, obj):
        colores = {
            "sent": "#0a7",
            "delivered": "#0a7",
            "read": "#0a7",
            "queued": "#888",
            "sending": "#888",
            "deferred": "#c80",
            "failed": "#c33",
            "bounced": "#c33",
            "dropped": "#c33",
            "spam": "#c33",
        }
        return format_html(
            '<b style="color:{}">{}</b>',
            colores.get(obj.status, "#000"),
            obj.get_status_display(),
        )

    @admin.display(description="Destinatarios")
    def destinatarios(self, obj) -> str:
        primero = (obj.to or [""])[0]
        resto = obj.recipient_count - 1
        return f"{primero} (+{resto})" if resto > 0 else primero

    def get_readonly_fields(self, request, obj=None):
        return [field.name for field in self.model._meta.fields]

    def has_add_permission(self, request) -> bool:
        return False

    def has_change_permission(self, request, obj=None) -> bool:
        return False


@admin.register(NotificationEvent)
class NotificationEventAdmin(admin.ModelAdmin):
    list_display = ("event", "recipient", "occurred_at", "message", "status_code")
    list_filter = ("event", "provider", "occurred_at")
    search_fields = ("recipient", "provider_message_id", "provider_event_id")
    date_hierarchy = "occurred_at"

    def get_readonly_fields(self, request, obj=None):
        return [field.name for field in self.model._meta.fields]

    def has_add_permission(self, request) -> bool:
        return False

    def has_change_permission(self, request, obj=None) -> bool:
        return False
