from django.contrib import admin
from django.utils.html import format_html
from .models import EmpaqueDistribucion

@admin.register(EmpaqueDistribucion)
class EmpaqueDistribucionAdmin(admin.ModelAdmin):
    list_display = (
        'referencia',
        'nombre',
        'unidades_por_empaque',
        'dimensiones',
        'peso_empaque',
        'datos_estiba',
        'activo',
        'empaque_lean',
        'mostrar_simbolo',
    )

    list_filter = (
        'referencia__tipo',
        'referencia__clasificacion',
        'unidad_medida_peso',
        'empaque_lean',
    )

    search_fields = (
        'nombre',
        'referencia__sku',
        'referencia__descripcion',
    )

    list_select_related = (
        'referencia',
        'unidad_medida_longitud',
        'unidad_medida_peso',
        'unidad_medida_volumen',
    )

    readonly_fields = (
        'volumen',
        'altura_optima',
        'items_por_estiba',
        'peso_estiva_completa',
        'volumen_estiva',
        'detalles_calculos',
    )

    fieldsets = (
        ('Información Básica', {
            'fields': (
                'referencia',
                'nombre',
                'descripcion',
            )
        }),
        ('Contenido del Empaque', {
            'fields': (
                'unidades_por_empaque',
            )
        }),
        ('Dimensiones', {
            'fields': (
                ('largo', 'unidad_medida_longitud'),
                ('ancho',),
                ('alto',),
                'volumen',
            )
        }),
        ('Peso', {
            'fields': (
                ('peso_empaque_lleno', 'unidad_medida_peso'),
            )
        }),
        ('Configuración de Estiba', {
            'fields': (
                ('niveles_maximos_estiba', 'empaques_por_nivel'),
                'unidad_medida_volumen',
            )
        }),
        ('Cálculos Automáticos', {
            'fields': (
                'altura_optima',
                'items_por_estiba',
                'peso_estiva_completa',
                'volumen_estiva',
                'detalles_calculos',
            ),
            'classes': ('collapse',)
        }),
        ('Configuración Adicional', {
            'fields': (
                'empaque_lean',
                'simbolo',
            )
        }),
    )

    def dimensiones(self, obj):
        return f"{obj.largo} × {obj.ancho} × {obj.alto} {obj.unidad_medida_longitud.abreviatura}"
    dimensiones.short_description = 'Dimensiones'

    def peso_empaque(self, obj):
        return f"{obj.peso_empaque_lleno} {obj.unidad_medida_peso.abreviatura}"
    peso_empaque.short_description = 'Peso'

    def datos_estiba(self, obj):
        return f"{obj.empaques_por_nivel} × {obj.niveles_maximos_estiba} niv"
    datos_estiba.short_description = 'Estiba'

    def activo(self, obj):
        return obj.referencia.activo
    activo.boolean = True
    activo.short_description = 'Activo'

    def mostrar_simbolo(self, obj):
        if obj.simbolo:
            return format_html('<img src="{}" width="30" height="30" style="object-fit:contain;" />', obj.simbolo.url)
        return "Sin símbolo"
    mostrar_simbolo.short_description = "Símbolo"

    def detalles_calculos(self, obj):
        if not obj.pk:
            return "Los cálculos se mostrarán después de guardar"
        
        return format_html(
            """
            <div style="background:#f8f8f8; padding:10px; border-left:4px solid #ddd">
                <h4>Detalles de Cálculos</h4>
                <ul>
                    <li><b>Volumen unitario:</b> {} × {} × {} = {} {}</li>
                    <li><b>Altura óptima:</b> {} × {} = {} {}</li>
                    <li><b>Ítems por estiba:</b> {} × {} × {} = {} unidades</li>
                    <li><b>Peso estiva completa:</b> {} × {} × {} = {} {}</li>
                    <li><b>Volumen por estiva:</b> {} × {} × {} = {} {}</li>
                </ul>
            </div>
            """,
            obj.largo, obj.ancho, obj.alto, obj.volumen, obj.unidad_medida_volumen.abreviatura,
            obj.alto, obj.niveles_maximos_estiba, obj.altura_optima, obj.unidad_medida_longitud.abreviatura,
            obj.unidades_por_empaque, obj.empaques_por_nivel, obj.niveles_maximos_estiba, obj.items_por_estiba,
            obj.peso_empaque_lleno, obj.empaques_por_nivel, obj.niveles_maximos_estiba, obj.peso_estiva_completa, obj.unidad_medida_peso.abreviatura,
            obj.volumen, obj.empaques_por_nivel, obj.niveles_maximos_estiba, obj.volumen_estiva, obj.unidad_medida_volumen.abreviatura,
        )
    detalles_calculos.short_description = 'Fórmulas de Cálculo'

    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        form.base_fields['referencia'].queryset = form.base_fields['referencia'].queryset.filter(tipo='PT')
        return form

    actions = ['duplicar_empaques']

    def duplicar_empaques(self, request, queryset):
        for empaque in queryset:
            empaque.pk = None
            empaque.nombre = f"Copia de {empaque.nombre}"
            empaque.save()
        self.message_user(request, f"{queryset.count()} empaques duplicados correctamente")
    duplicar_empaques.short_description = "Duplicar empaques seleccionados"

    save_on_top = True
    list_per_page = 25
    list_max_show_all = 100
    show_full_result_count = False
