# views.py
from django.shortcuts import render, redirect, get_object_or_404
from referencias.models import Referencia
from lista_de_materiales.models import ListaMateriales, ComponenteListaMateriales
from decimal import Decimal
from django.contrib import messages

def obtener_bom_completo(referencia):
    try:
        bom = ListaMateriales.objects.get(referencia=referencia, estado='A')
    except ListaMateriales.DoesNotExist:
        return {
            "sku": referencia.sku,
            "descripcion": referencia.descripcion,
            "unidad": referencia.unidad.abreviatura,
            "tipo": referencia.get_tipo_display(),
            "cantidad": Decimal('1.0'),
            "componentes": []
        }

    resultado = {
        "sku": referencia.sku,
        "descripcion": referencia.descripcion,
        "unidad": referencia.unidad.abreviatura,
        "tipo": referencia.get_tipo_display(),
        "cantidad": Decimal('1.0'),
        "componentes": []
    }

    for componente in bom.componentes.all().select_related('referencia', 'referencia__unidad'):
        sub_arbol = obtener_bom_completo(componente.referencia)
        sub_arbol["cantidad"] = componente.cantidad_total
        resultado["componentes"].append(sub_arbol)

    return resultado

# views.py
def arbol_bom_selector_view(request):
    referencias_pp_pt = Referencia.objects.filter(tipo__in=['PP', 'PT']).select_related('unidad')
    referencias_posibles = Referencia.objects.filter(activo=True).select_related('unidad')

    estructura = None
    sku_seleccionado = None

    if request.method == 'POST':
        sku_seleccionado = request.POST.get('sku')
        referencia = Referencia.objects.get(sku=sku_seleccionado)
        estructura = obtener_bom_completo(referencia)

    return render(request, 'bom/arbol_bom_interactivo.html', {
        "referencias": referencias_pp_pt,
        "estructura": estructura,
        "referencias_posibles": referencias_posibles,
        "sku_seleccionado": sku_seleccionado
    })

def agregar_componente_bom(request):
    if request.method == 'POST':
        padre_sku = request.POST.get("padre_sku")
        referencias = request.POST.getlist("referencias[]")
        cantidades = request.POST.getlist("cantidades[]")
        desperdicios = request.POST.getlist("desperdicios[]")

        padre_ref = get_object_or_404(Referencia, sku=padre_sku)

        bom_padre, _ = ListaMateriales.objects.get_or_create(
            referencia=padre_ref,
            estado='A',
            defaults={
                "version": 1,
                "creado_por": request.user,
                "descripcion": f"BOM creado automáticamente para {padre_ref.sku}",
                "codigo": f"BOM-{padre_ref.sku}-1"
            }
        )

        creados = 0
        for ref_id, cant, desp in zip(referencias, cantidades, desperdicios):
            if not ref_id or not cant:
                continue
            try:
                ref_obj = Referencia.objects.get(pk=ref_id)
                cantidad = Decimal(cant)
                desperdicio = Decimal(desp) if desp else Decimal('0')
            except (Referencia.DoesNotExist, ValueError):
                continue

            ComponenteListaMateriales.objects.create(
                lista_materiales=bom_padre,
                referencia=ref_obj,
                cantidad=cantidad,
                desperdicio=desperdicio
            )
            creados += 1

        messages.success(request, f"Se agregaron {creados} componentes al BOM {bom_padre.codigo}.")
        return redirect('arbol_bom_selector')  # Ajusta este nombre si lo llamaste diferente

    messages.error(request, "Error al procesar el formulario.")
    return redirect('arbol_bom_selector')