from django.contrib import admin
from django.db.models import Q
from django.utils.html import format_html
from django import forms
from referencias.models import Referencia
from .models import ListaMateriales, ComponenteListaMateriales
from . import views  # Import the views module from the current app
from django.urls import path  # Import the path function for URL patterns

class ComponenteListaMaterialesForm(forms.ModelForm):
    class Meta:
        model = ComponenteListaMateriales
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if 'referencia' in self.fields:
            # Filtrar solo Materias Primas y Productos en Proceso
            self.fields['referencia'].queryset = Referencia.objects.filter(
                Q(tipo='MP') | Q(tipo='PP'),
                activo=True
            ).select_related('unidad')

            # Mejorar la visualización de las opciones
            self.fields['referencia'].label_from_instance = lambda obj: (
                f"{obj.sku} - {obj.descripcion[:50]} "
                f"[{obj.get_tipo_display()}] ({obj.unidad.abreviatura})"
            )

class ComponenteListaMaterialesInline(admin.TabularInline):
    model = ComponenteListaMateriales
    form = ComponenteListaMaterialesForm
    extra = 1
    fields = ('referencia', 'cantidad', 'desperdicio', 'orden', 'obligatorio', 'notas')
    # raw_id_fields = ('referencia',)  <-- ELIMINAR ESTA LÍNEA
    # autocomplete_lookup_fields = {  <-- ELIMINAR ESTE BLOQUE
    #     'fk': ['referencia']
    # }

    # def get_formset(self, request, obj=None, **kwargs):  <-- ELIMINAR ESTA FUNCIÓN COMPLETA
    #     formset = super().get_formset(request, obj, **kwargs)
    #     # Mejorar el widget del selector de referencias
    #     formset.form.base_fields['referencia'].widget.attrs.update({
    #         'style': 'width: 600px;',
    #         'data-placeholder': 'Buscar referencia (MP o PP)...'
    #     })
    #     return formset

class ListaMaterialesForm(forms.ModelForm):
    class Meta:
        model = ListaMateriales
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if 'referencia' in self.fields:
            # Filtrar solo Productos en Proceso y Terminados para la lista principal
            self.fields['referencia'].queryset = Referencia.objects.filter(
                Q(tipo='PP') | Q(tipo='PT'),
                activo=True
            ).select_related('unidad')

            # Mejorar la visualización de las opciones
            self.fields['referencia'].label_from_instance = lambda obj: (
                f"{obj.sku} - {obj.descripcion[:50]} "
                f"[{obj.get_tipo_display()}] ({obj.unidad.abreviatura})"
            )

@admin.register(ListaMateriales)
class ListaMaterialesAdmin(admin.ModelAdmin):
    form = ListaMaterialesForm
    list_display = ('codigo', 'referencia_info', 'version', 'estado_display', 'fecha_creacion', 'componentes_count')
    list_filter = ('estado', 'referencia__tipo', 'referencia__grupo', 'referencia__subgrupo')
    search_fields = ('codigo', 'referencia__sku', 'referencia__descripcion', 'descripcion')
    inlines = [ComponenteListaMaterialesInline]
    readonly_fields = ('fecha_creacion', 'fecha_actualizacion', 'fecha_activacion', 'codigo')

    class Media:
        css = {
            'all': ['admin/css/selectors.css']
        }

    fieldsets = (
        ('Información Básica', {
            'fields': ('referencia', 'version', 'codigo', 'estado', 'descripcion')
        }),
        ('Información Técnica', {
            'fields': ('notas',)
        }),
        ('Auditoría', {
            'classes': ('collapse',),
            'fields': ('creado_por', 'fecha_creacion', 'fecha_actualizacion', 'fecha_activacion')
        }),
    )

    def referencia_info(self, obj):
        return format_html(
            '<div style="min-width: 300px;"><strong>{}</strong><br>'
            '<span style="color: #666;">{} - {} ({})</span></div>',
            obj.referencia.sku,
            obj.referencia.get_tipo_display(),
            obj.referencia.descripcion[:50],
            obj.referencia.unidad.abreviatura
        )
    referencia_info.short_description = "Referencia"

    def estado_display(self, obj):
        estado_colors = {
            'D': '#777',     # Gris para Borrador
            'A': '#4CAF50', # Verde para Activa
            'H': '#2196F3', # Azul para Histórica
            'I': '#F44336'  # Rojo para Inactiva
        }
        return format_html(
            '<span style="color: white; background-color: {}; '
            'padding: 3px 8px; border-radius: 4px;">{}</span>',
            estado_colors.get(obj.estado, 'black'),
            obj.get_estado_display()
        )
    estado_display.short_description = "Estado"

    def componentes_count(self, obj):
        count = obj.componentes.count()
        return format_html(
            '<span style="font-weight: bold; color: {};">{}</span> componente{}',
            '#4CAF50' if count > 0 else '#F44336',
            count,
            '' if count == 1 else 's'
        )
    componentes_count.short_description = "Componentes"

    def save_model(self, request, obj, form, change):
        if not change:
            obj.creado_por = request.user
        super().save_model(request, obj, form, change)

    def get_queryset(self, request):
        return super().get_queryset(request).select_related(
            'referencia', 'referencia__unidad'
        ).prefetch_related('componentes')
        
    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
                path(
                    "bom/",
                    self.admin_site.admin_view(views.arbol_bom_selector_view),
                    name="lista_de_materiales_listamateriales_arbol_bom_selector"  # ⬅️ el name debe coincidir
                )
            ]
        return custom_urls + urls


@admin.register(ComponenteListaMateriales)
class ComponenteListaMaterialesAdmin(admin.ModelAdmin):
    list_display = (
        'lista_materiales_info',
        'referencia_info',
        'cantidad_display',
        'desperdicio_display',
        'obligatorio_icon',
        'orden'
    )
    list_filter = (
        'lista_materiales__estado',
        'referencia__tipo',
        'obligatorio'
    )
    search_fields = (
        'lista_materiales__codigo',
        'referencia__sku',
        'referencia__descripcion'
    )
    list_select_related = (
        'lista_materiales',
        'referencia',
        'lista_materiales__referencia',
        'referencia__unidad'
    )
    list_per_page = 50

    def lista_materiales_info(self, obj):
        return format_html(
            '<div style="min-width: 200px;"><strong>{}</strong> v{}<br>'
            '<span style="color: #666;">{}</span></div>',
            obj.lista_materiales.codigo,
            obj.lista_materiales.version,
            obj.lista_materiales.referencia.sku
        )
    lista_materiales_info.short_description = "Lista de Materiales"

    def referencia_info(self, obj):
        return format_html(
            '<div style="min-width: 300px;"><strong>{}</strong><br>'
            '<span style="color: #666;">{} - {} ({})</span></div>',
            obj.referencia.sku,
            obj.referencia.get_tipo_display(),
            obj.referencia.descripcion[:40],
            obj.referencia.unidad.abreviatura
        )
    referencia_info.short_description = "Componente"

    def cantidad_display(self, obj):
        try:
            cantidad = round(float(obj.cantidad), 4)
            unidad = obj.referencia.unidad.abreviatura

            html = (
                '<div style="text-align: center;"><strong>{:.4f}</strong><br>'
                '<span style="color: #666;">{}</span></div>'
            ).format(cantidad, unidad)

            return format_html(html)
        except Exception as e:
            return format_html('<span style="color: red;">Error: {}</span>', str(e))

    
    def desperdicio_display(self, obj):
        try:
            desperdicio = round(obj.desperdicio, 2)
            cantidad_total = round(obj.cantidad_total, 4)

            html = (
                '<div style="text-align: center; color: {color};">'
                '{desperdicio:.2f}%<br>'
                '<span style="color: #666;">Total: {total:.4f}</span></div>'
            ).format(
                color='#FF5722' if desperdicio > 0 else '#666',
                desperdicio=desperdicio,
                total=cantidad_total
            )

            return format_html(html)
        except Exception as e:
            return format_html('<span style="color: red;">Error: {}</span>', str(e))




    def obligatorio_icon(self, obj):
        return format_html(
            '<div style="text-align: center;">'
            '<span style="color: {}; font-weight: bold;">{}</span></div>',
            '#4CAF50' if obj.obligatorio else '#F44336',
            '✓' if obj.obligatorio else '✗'
        )
    obligatorio_icon.short_description = "Obligatorio"

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "referencia":
            kwargs["queryset"] = Referencia.objects.filter(
                Q(tipo='MP') | Q(tipo='PP'),
                activo=True
            ).select_related('unidad')
        elif db_field.name == "lista_materiales":
            kwargs["queryset"] = ListaMateriales.objects.select_related('referencia')
        return super().formfield_for_foreignkey(db_field, request, **kwargs)