from django.contrib import admin
from django.http import HttpResponseRedirect
from django.template.response import TemplateResponse
from django.urls import path, reverse
from django.utils.html import format_html

from .models import Galeria, GaleriaItem, HorarioSitio, LoginAttempt, SiteConfig, SobreMiCheck


@admin.register(LoginAttempt)
class LoginAttemptAdmin(admin.ModelAdmin):
    list_display = ("username", "ip_address", "was_successful", "attempted_at")
    list_filter = ("was_successful", "attempted_at")
    search_fields = ("username", "ip_address")
    readonly_fields = ("username", "ip_address", "user_agent", "attempted_at", "was_successful")
    ordering = ("-attempted_at",)

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return False


class SobreMiCheckInline(admin.TabularInline):
    model = SobreMiCheck
    extra = 1
    fields = ("texto", "visible", "orden")
    ordering = ("orden",)


class HorarioSitioInline(admin.TabularInline):
    model = HorarioSitio
    extra = 1
    fields = ("clinica", "horario", "visible", "orden")
    autocomplete_fields = ("clinica",)
    ordering = ("orden",)


@admin.register(SiteConfig)
class SiteConfigAdmin(admin.ModelAdmin):
    inlines = [SobreMiCheckInline, HorarioSitioInline]
    fieldsets = (
        ("Identidade Visual", {
            "fields": ("logo", "favicon"),
            "description": "Logo e ícone do site. O logo aparece no cabeçalho e o favicon na aba do navegador.",
            "classes": ("collapse",),
        }),
        ("Textos do Banner Principal", {
            "fields": ("titulo_hero_linea1", "titulo_hero_linea2", "titulo_hero_linea3", "subtitulo_hero"),
            "description": "Estes textos aparecem no banner principal (hero) da página inicial.",
            "classes": ("collapse",),
        }),
        ("Dados da Doutora", {
            "fields": ("nombre_completo", "especialidad", "foto_banner", "foto_perfil"),
            "classes": ("collapse",),
        }),
        ("Contacto", {
            "fields": ("telefono", "email", "direccion"),
            "classes": ("collapse",),
        }),
        ("Redes Sociais", {
            "fields": (
                "facebook_url", "instagram_url", "twitter_url",
                "linkedin_url", "tiktok_url", "youtube_url", "whatsapp_url",
            ),
            "classes": ("collapse",),
        }),
        ("Secção Sobre Mim", {
            "fields": (
                "sobre_mi_titulo", "sobre_mi_texto", "sobre_mi_texto2",
                "sobre_mi_anios_experiencia", "sobre_mi_pacientes", "sobre_mi_cirugias",
            ),
            "description": "Conteúdo editável da secção 'Sobre Mim'. Os checks são configurados abaixo como itens individuais.",
            "classes": ("collapse",),
        }),
        ("Rodapé (Copyright)", {
            "fields": ("texto_copyright",),
            "description": "Texto que aparece na parte inferior do site. Se deixado vazio, é gerado automaticamente com o nome e especialidade.",
            "classes": ("collapse",),
        }),
    )

    def has_add_permission(self, request):
        # Solo permitir agregar si no existe ningún registro aún
        return not SiteConfig.objects.exists()

    def has_delete_permission(self, request, obj=None):
        return False


class GaleriaItemInline(admin.StackedInline):
    model = GaleriaItem
    extra = 1
    fields = (
        ("preview_thumb", "tipo", "orden", "mostrar_en_home"),
        ("titulo", "descripcion"),
        ("imagen", "posicion_foto"),
        ("video_file", "video_url"),
    )
    readonly_fields = ("preview_thumb",)
    ordering = ("orden",)

    @admin.display(description="Pré-visualização")
    def preview_thumb(self, obj):
        if obj.pk and obj.imagen:
            return format_html(
                '<img src="{}" style="width:80px;height:80px;object-fit:cover;border-radius:10px;'
                'border:2px solid #E8336A33;"/>',
                obj.imagen.url,
            )
        if obj.pk and (obj.video_file or obj.video_url):
            return format_html(
                '<span style="display:inline-flex;align-items:center;justify-content:center;'
                'width:80px;height:80px;border-radius:10px;background:#1A1A2E;color:#E8336A;'
                'font-size:28px;">▶</span>'
            )
        return "—"


@admin.register(Galeria)
class GaleriaAdmin(admin.ModelAdmin):
    list_display = ("nombre", "total_items_display", "mostrar_en_home", "orden")
    list_display_links = ("nombre",)
    list_editable = ("mostrar_en_home", "orden")
    list_filter = ("mostrar_en_home",)
    search_fields = ("nombre", "descripcion")
    ordering = ("orden",)
    inlines = [GaleriaItemInline]
    change_list_template = "admin/core/galeria/change_list.html"
    fieldsets = (
        (None, {
            "fields": ("nombre", "descripcion", "mostrar_en_home", "orden"),
        }),
    )

    @admin.display(description="Elementos")
    def total_items_display(self, obj):
        count = obj.items.filter(is_active=True).count()
        return format_html(
            '<span style="background:#E8336A;color:#fff;padding:2px 10px;border-radius:12px;'
            'font-size:12px;font-weight:600;">{}</span>',
            count,
        )

    def get_urls(self):
        urls = super().get_urls()
        custom = [
            path(
                "subida-masiva/",
                self.admin_site.admin_view(self.bulk_upload_view),
                name="core_galeria_bulk_upload",
            ),
        ]
        return custom + urls

    def bulk_upload_view(self, request):
        if request.method == "POST":
            galeria_id = request.POST.get("galeria")
            galeria = Galeria.objects.filter(pk=galeria_id).first() if galeria_id else None
            images = request.FILES.getlist("imagenes")
            videos = request.FILES.getlist("videos")
            max_orden = GaleriaItem.objects.order_by("-orden").values_list("orden", flat=True).first() or 0
            count = 0
            for f in images:
                max_orden += 1
                GaleriaItem.objects.create(
                    galeria=galeria,
                    tipo=GaleriaItem.TipoMedia.FOTO,
                    imagen=f,
                    titulo=f.name.rsplit(".", 1)[0][:120],
                    orden=max_orden,
                )
                count += 1
            for f in videos:
                max_orden += 1
                GaleriaItem.objects.create(
                    galeria=galeria,
                    tipo=GaleriaItem.TipoMedia.VIDEO,
                    video_file=f,
                    titulo=f.name.rsplit(".", 1)[0][:120],
                    orden=max_orden,
                )
                count += 1
            self.message_user(request, f"Foram carregados {count} elemento(s) para a galeria.")
            return HttpResponseRedirect(reverse("admin:core_galeria_changelist"))

        context = {
            **self.admin_site.each_context(request),
            "title": "Carregamento em massa — Galeria",
            "opts": self.model._meta,
            "galerias": Galeria.objects.filter(is_active=True).order_by("nombre"),
        }
        return TemplateResponse(request, "admin/core/galeria/bulk_upload.html", context)
