# fabricacion/admin.py
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 PlantaProduccion, Maquina, MaquinaReferencia, Mantenimiento, Reparacion , Referencia

@admin.register(PlantaProduccion)
class PlantaProduccionAdmin(admin.ModelAdmin):
    list_display = (
        'nombre',
        'contacto_produccion',
        'telefono_contacto',
        'email_contacto',
        'activo',
        'maquinas_count',
    )
    
    list_filter = ('activo',)
    search_fields = ('nombre', 'direccion', 'contacto_produccion')
    actions = ['activar_plantas', 'desactivar_plantas']
    
    def maquinas_count(self, obj):
        return obj.maquinas.count()
    maquinas_count.short_description = '# Máquinas'
    
    def activar_plantas(self, request, queryset):
        queryset.update(activo=True)
    activar_plantas.short_description = "Activar plantas seleccionadas"
    
    def desactivar_plantas(self, request, queryset):
        queryset.update(activo=False)
    desactivar_plantas.short_description = "Desactivar plantas seleccionadas"

@admin.register(Maquina)
class MaquinaAdmin(admin.ModelAdmin):
    list_display = (
        'nombre',
        'planta_link',
        'mostrar_tiempo_configuracion',
        'mostrar_periodo_mantenimiento',
        'activa',
        'proxima_mantenimiento',
        'referencias_count',
    )

    list_filter = ('planta', 'activa')
    search_fields = ('nombre', 'planta__nombre')
    list_select_related = ('planta',)
    raw_id_fields = ('planta',)
    actions = ['activar_maquinas', 'desactivar_maquinas']

    fieldsets = (
        (None, {
            'fields': (
                'planta',
                'nombre',
                ('tiempo_configuracion', 'periodo_mantenimiento'),
                'activa',
            )
        }),
    )

    def planta_link(self, obj):
        try:
            url = reverse('admin:fabricacion_plantaproduccion_change', args=[obj.planta.id])
            return mark_safe(f'<a href="{url}">{obj.planta}</a>')
        except Exception:
            return "-"
    planta_link.short_description = 'Planta'

    def mostrar_tiempo_configuracion(self, obj):
        try:
            return f"{obj.tiempo_configuracion} h"
        except Exception:
            return "-"
    mostrar_tiempo_configuracion.short_description = 'Tiempo para poner operativa (horas)'

    def mostrar_periodo_mantenimiento(self, obj):
        try:
            return f"{obj.periodo_mantenimiento} días"
        except Exception:
            return "-"
    mostrar_periodo_mantenimiento.short_description = 'Período entre mantenimientos (días)'

    def referencias_count(self, obj):
        try:
            count = obj.referencias_maquina.count()
            if count == 0:
                return format_html('<span style="color: #bbb;">0</span>')
            return count
        except Exception:
            return "-"
    referencias_count.short_description = '# Referencias'

    def proxima_mantenimiento(self, obj):
        try:
            last_maintenance = obj.mantenimientos.filter(realizado=True).order_by('-fecha_realizacion').first()
            if last_maintenance:
                return f"Cada {obj.periodo_mantenimiento} días"
            return "Nunca mantenida"
        except Exception:
            return "-"
    proxima_mantenimiento.short_description = 'Próxima mantenimiento'

    def activar_maquinas(self, request, queryset):
        queryset.update(activa=True)
    activar_maquinas.short_description = "Activar máquinas seleccionadas"

    def desactivar_maquinas(self, request, queryset):
        queryset.update(activa=False)
    desactivar_maquinas.short_description = "Desactivar máquinas seleccionadas"
class MaquinaReferenciaInline(admin.TabularInline):
    model = MaquinaReferencia
    extra = 1
    fields = (
        'maquina',
        'unidades_por_minuto',
        'lead_time_total',
        'minimo_unidades',
        'empaque',
    )
    readonly_fields = ('lead_time_total',)
    autocomplete_fields = ('maquina'), ('empaque')

@admin.register(MaquinaReferencia)
class MaquinaReferenciaAdmin(admin.ModelAdmin):
    raw_id_fields = ('referencia',)
    autocomplete_fields = ('maquina', 'empaque')

    list_display = (
        'referencia',
        'maquina_link',
        'unidades_por_minuto',
        'lead_time_total',
        'minimo_unidades',
        'produccion_estimada',
    )

    list_filter = ('maquina__planta', 'maquina')
    search_fields = (
        'referencia__sku',
        'referencia__descripcion',
        'maquina__nombre',
    )
    list_select_related = ('referencia', 'maquina', 'maquina__planta', 'empaque')

    readonly_fields = ('lead_time_total',)

    fieldsets = (
        (None, {
            'fields': (
                ('referencia',),
                ('maquina',),
                ('unidades_por_minuto', 'minimo_unidades'),
                ('lead_time_generar_orden', 'lead_time_produccion'),
                ('lead_time_total',),
                ('empaque', 'unidades_por_empaque'),
            )
        }),
    )

    def maquina_link(self, obj):
        url = reverse('admin:fabricacion_maquina_change', args=[obj.maquina.id])
        return format_html('<a href="{}">{}</a>', url, obj.maquina)
    maquina_link.short_description = 'Máquina'

    def produccion_estimada(self, obj):
        return f"{obj.tiempo_estimado_produccion(1000):.1f} min/1000u"
    produccion_estimada.short_description = 'Tiempo 1000u'

    def render_extra_referencia_info(self, request, obj=None):
        if not obj or not obj.referencia:
            return mark_safe("""
                <div class="form-row"><label>SKU:</label><div id="id_sku_referencia" class="readonly"></div></div>
                <div class="form-row"><label>Descripción:</label><div id="id_descripcion_referencia" class="readonly"></div></div>
            """)
        return mark_safe(f"""
            <div class="form-row"><label>SKU:</label><div id="id_sku_referencia" class="readonly">{obj.referencia.sku}</div></div>
            <div class="form-row"><label>Descripción:</label><div id="id_descripcion_referencia" class="readonly">{obj.referencia.descripcion}</div></div>
        """)

    def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
        context['adminform'].form.fields['referencia'].help_text = mark_safe('Selecciona una referencia con la lupa.')
        context['extra_info'] = mark_safe("""
            <div id="referencia-info-extra" style="margin-top: 5px;">
                <div><strong>SKU:</strong> <span id="id_sku_referencia" style="color: #555;">-</span></div>
                <div><strong>Descripción:</strong> <span id="id_descripcion_referencia" style="color: #555;">-</span></div>
            </div>
        """)
        return super().render_change_form(request, context, add, change, form_url, obj)


    class Media:
        js = ('js/maquina_referencia_admin.js',)


@admin.register(Mantenimiento)
class MantenimientoAdmin(admin.ModelAdmin):
    list_display = (
        'maquina_link',
        'fecha_programada',
        'realizado',
        'fecha_realizacion',
        'tiempo_mantenimiento',
        'concepto_short',
    )
    
    list_filter = (
        'maquina__planta',
        'realizado',
        'fecha_programada',
    )
    search_fields = (
        'maquina__nombre',
        'concepto',
    )
    list_select_related = ('maquina'), ('maquina__planta')
    date_hierarchy = 'fecha_programada'
    
    fieldsets = (
        (None, {
            'fields': (
                'maquina',
                ('fecha_programada'), ('realizado'),
                'fecha_realizacion',
                'tiempo_mantenimiento',
                'concepto',
            )
        }),
    )
    
    def maquina_link(self, obj):
        url = reverse('admin:fabricacion_maquina_change', args=[obj.maquina.id])
        return mark_safe(f'<a href="{url}">{obj.maquina}</a>')
    maquina_link.short_description = 'Máquina'
    
    def concepto_short(self, obj):
        return obj.concepto[:50] + '...' if len(obj.concepto) > 50 else obj.concepto
    concepto_short.short_description = 'Concepto'

@admin.register(Reparacion)
class ReparacionAdmin(admin.ModelAdmin):
    list_display = (
        'maquina_link',
        'fecha_reparacion',
        'tiempo_arreglo',
        'concepto_short',
    )
    
    list_filter = (
        'maquina__planta',
        'fecha_reparacion',
    )
    search_fields = (
        'maquina__nombre',
        'concepto',
    )
    list_select_related = ('maquina'), ('maquina__planta')
    date_hierarchy = 'fecha_reparacion'
    
    fieldsets = (
        (None, {
            'fields': (
                'maquina',
                'fecha_reparacion',
                'tiempo_arreglo',
                'concepto',
                'observaciones',
            )
        }),
    )
    
    def maquina_link(self, obj):
        url = reverse('admin:fabricacion_maquina_change', args=[obj.maquina.id])
        return mark_safe(f'<a href="{url}">{obj.maquina}</a>')
    maquina_link.short_description = 'Máquina'
    
    def concepto_short(self, obj):
        return obj.concepto[:50] + '...' if len(obj.concepto) > 50 else obj.concepto
    concepto_short.short_description = 'Concepto'