from django.contrib import admin
from django.utils.html import format_html
from django.urls import reverse
from django.utils.safestring import mark_safe
from .models import TipoDiarioOficial, DiarioOficial, PageDiarioOficial
from .forms import PageDiarioOficialInlineForm


@admin.register(TipoDiarioOficial)
class TipoDiarioOficialAdmin(admin.ModelAdmin):
    list_display = ("nome", "quantidade_diarios")
    search_fields = ("nome",)
    ordering = ("nome",)

    def quantidade_diarios(self, obj):
        return obj.diarios.count()

    quantidade_diarios.short_description = "Nº de Diários"


class PageDiarioOficialInline(admin.TabularInline):
    form = PageDiarioOficialInlineForm
    model = PageDiarioOficial
    extra = 0
    fields = ("id", "numero", "conteudo")
    can_delete = False

    def numero_link(self, instance):
        if instance.id:
            url = reverse("admin:diarios_pagediariooficial_change", args=[instance.id])
            return mark_safe(f'<a href="{url}">{instance.numero}</a>')
        return instance.numero

    def conteudo_resumido(self, instance):
        return (
            (instance.conteudo[:100] + "...")
            if len(instance.conteudo) > 100
            else instance.conteudo
        )

    conteudo_resumido.short_description = "Conteúdo (resumo)"


@admin.register(DiarioOficial)
class DiarioOficialAdmin(admin.ModelAdmin):
    list_display = (
        "numero",
        "tipo_nome",
        "data_formatada_admin",
        "arquivo_link",
        "link_externo",
        "paginas_count",
    )
    list_filter = ("tipo", "data")
    search_fields = ("numero", "tipo__nome", "data")
    date_hierarchy = "data"
    ordering = ("-data", "-numero")
    readonly_fields = (
        "data_formatada_admin",
        "arquivo_preview",
        "paginas_count",
        "link_externo",
    )
    fieldsets = (
        (
            "Informações Básicas",
            {"fields": ("numero", "tipo", "data", "data_formatada_admin")},
        ),
        (
            "Arquivos e Links",
            {"fields": ("arquivo", "arquivo_preview", "link", "link_externo")},
        ),
        ("Estatísticas", {"fields": ("paginas_count",), "classes": ("collapse",)}),
    )
    # inlines = (PageDiarioOficialInline,)

    def tipo_nome(self, obj):
        return obj.tipo.nome if obj.tipo else "-"

    tipo_nome.short_description = "Tipo"
    tipo_nome.admin_order_field = "tipo__nome"

    def data_formatada_admin(self, obj):
        return obj.data_formatada

    data_formatada_admin.short_description = "Data"

    def arquivo_link(self, obj):
        if obj.arquivo:
            return mark_safe(
                f'<a href="{obj.arquivo.url}" target="_blank">Download PDF</a>'
            )
        return "-"

    arquivo_link.short_description = "Arquivo"
    arquivo_link.allow_tags = True

    def link_externo(self, obj):
        if obj.link:
            return mark_safe(f'<a href="{obj.link}" target="_blank">Acessar Online</a>')
        return "-"

    link_externo.short_description = "Link Externo"
    link_externo.allow_tags = True

    def arquivo_preview(self, obj):
        if obj.arquivo:
            return mark_safe(
                f'<a href="{obj.arquivo.url}" target="_blank">Visualizar PDF</a>'
            )
        return "-"

    arquivo_preview.short_description = "Pré-visualização"
    arquivo_preview.allow_tags = True

    def paginas_count(self, obj):
        return obj.paginas.count()

    paginas_count.short_description = "Nº de Páginas"

    def get_queryset(self, request):
        return super().get_queryset(request).prefetch_related("paginas")


@admin.register(PageDiarioOficial)
class PageDiarioOficialAdmin(admin.ModelAdmin):
    autocomplete_fields = ("diario",)
    list_display = ("id", "diario_link", "numero", "conteudo_resumido")
    list_display_links = ('id', 'numero')
    list_filter = ("diario__tipo", "diario__data", "layout_duas_colunas")
    search_fields = ("diario__numero",)
    readonly_fields = (
        "diario_link",
    )


    def diario_link(self, obj):
        url = reverse("admin:diarios_diariooficial_change", args=[obj.diario.id])
        return mark_safe(f'<a href="{url}">{obj.diario}</a>')

    diario_link.short_description = "Diário Oficial"
    diario_link.allow_tags = True

    def conteudo_resumido(self, obj):
        return (obj.conteudo[:100] + "...") if len(obj.conteudo) > 100 else obj.conteudo

    conteudo_resumido.short_description = "Conteúdo"

    def get_queryset(self, request):
        return super().get_queryset(request).select_related("diario")
