<?php
if (!defined('BASEPATH')) {
    http_response_code(403);
    die(json_encode(["success" => false, "message" => "Acceso directo no permitido"]));
}

switch ($tipo) {
    case 'getProductosConReceta':
        // Obtener productos que tienen receta
        $sql = "SELECT p.id, p.nombre, p.unidad, p.precio, p.stock,
                COALESCE(p.produccion_directa, 0) as produccion_directa,
                c.nombre as categoria
                FROM productos p
                LEFT JOIN categorias_productos c ON p.categoria_id = c.id
                WHERE p.activo = 1 AND p.tiene_receta = 1
                ORDER BY p.nombre ASC";
        $result = mysqli_query($conn, $sql);

        if ($result) {
            $productos = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $productos[] = [
                    'id' => (int)$row['id'],
                    'nombre' => $row['nombre'],
                    'unidad' => $row['unidad'],
                    'precio' => (float)$row['precio'],
                    'stock' => (float)$row['stock'],
                    'categoria' => $row['categoria'],
                    'produccion_directa' => (int)$row['produccion_directa']
                ];
            }
            sendResponse(true, "Productos con receta obtenidos", $productos);
        } else {
            sendResponse(false, "Error al obtener productos: " . mysqli_error($conn));
        }
        break;

    case 'getProducciones':
        $fecha_inicio = isset($datapost['fecha_inicio']) ? mysqli_real_escape_string($conn, $datapost['fecha_inicio']) : date('Y-m-d');
        $fecha_fin = isset($datapost['fecha_fin']) ? mysqli_real_escape_string($conn, $datapost['fecha_fin']) : date('Y-m-d');
        $producto_id = isset($datapost['producto_id']) ? (int)$datapost['producto_id'] : 0;

        $sql = "SELECT pr.*, p.nombre as producto_nombre, p.unidad as producto_unidad,
                u.nombre as usuario_nombre
                FROM producciones pr
                INNER JOIN productos p ON pr.producto_id = p.id
                LEFT JOIN usuarios u ON pr.usuario_id = u.id
                WHERE pr.fecha BETWEEN '$fecha_inicio' AND '$fecha_fin'";

        if ($producto_id > 0) {
            $sql .= " AND pr.producto_id = $producto_id";
        }

        $sql .= " ORDER BY pr.fecha DESC, pr.created_at DESC";

        $result = mysqli_query($conn, $sql);

        if ($result) {
            $producciones = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $producciones[] = [
                    'id' => (int)$row['id'],
                    'producto_id' => (int)$row['producto_id'],
                    'producto_nombre' => $row['producto_nombre'],
                    'producto_unidad' => $row['producto_unidad'],
                    'cantidad_producida' => (float)$row['cantidad_producida'],
                    'unidad' => $row['unidad'],
                    'fecha' => $row['fecha'],
                    'hora' => $row['hora'],
                    'usuario' => $row['usuario_nombre'],
                    'notas' => $row['notas'],
                    'estado' => $row['estado']
                ];
            }
            sendResponse(true, "Producciones obtenidas", $producciones);
        } else {
            sendResponse(false, "Error al obtener producciones: " . mysqli_error($conn));
        }
        break;

    case 'getProduccion':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;

        if ($id <= 0) {
            sendResponse(false, "ID de produccion no valido");
        }

        // Obtener produccion
        $sql = "SELECT pr.*, p.nombre as producto_nombre, p.unidad as producto_unidad,
                u.nombre as usuario_nombre
                FROM producciones pr
                INNER JOIN productos p ON pr.producto_id = p.id
                LEFT JOIN usuarios u ON pr.usuario_id = u.id
                WHERE pr.id = $id";
        $result = mysqli_query($conn, $sql);

        if (!$result || mysqli_num_rows($result) == 0) {
            sendResponse(false, "Produccion no encontrada");
        }

        $row = mysqli_fetch_assoc($result);
        $produccion = [
            'id' => (int)$row['id'],
            'producto_id' => (int)$row['producto_id'],
            'producto_nombre' => $row['producto_nombre'],
            'producto_unidad' => $row['producto_unidad'],
            'cantidad_producida' => (float)$row['cantidad_producida'],
            'unidad' => $row['unidad'],
            'fecha' => $row['fecha'],
            'hora' => $row['hora'],
            'usuario' => $row['usuario_nombre'],
            'notas' => $row['notas'],
            'estado' => $row['estado']
        ];

        // Obtener ingredientes usados
        $sqlIng = "SELECT pi.*, i.nombre as ingrediente_nombre
                   FROM produccion_ingredientes pi
                   INNER JOIN ingredientes i ON pi.ingrediente_id = i.id
                   WHERE pi.produccion_id = $id";
        $resultIng = mysqli_query($conn, $sqlIng);

        $ingredientes = [];
        if ($resultIng) {
            while ($rowIng = mysqli_fetch_assoc($resultIng)) {
                $ingredientes[] = [
                    'ingrediente_id' => (int)$rowIng['ingrediente_id'],
                    'nombre' => $rowIng['ingrediente_nombre'],
                    'cantidad_usada' => (float)$rowIng['cantidad_usada'],
                    'unidad' => $rowIng['unidad'],
                    'costo_unitario' => (float)$rowIng['costo_unitario']
                ];
            }
        }

        // Obtener componentes usados
        $sqlComp = "SELECT pc.*, p.nombre as componente_nombre
                    FROM produccion_componentes pc
                    INNER JOIN productos p ON pc.componente_id = p.id
                    WHERE pc.produccion_id = $id";
        $resultComp = mysqli_query($conn, $sqlComp);

        $componentes = [];
        if ($resultComp) {
            while ($rowComp = mysqli_fetch_assoc($resultComp)) {
                $componentes[] = [
                    'componente_id' => (int)$rowComp['componente_id'],
                    'nombre' => $rowComp['componente_nombre'],
                    'cantidad_usada' => (float)$rowComp['cantidad_usada'],
                    'unidad' => $rowComp['unidad'],
                    'costo_unitario' => (float)$rowComp['costo_unitario']
                ];
            }
        }

        $produccion['ingredientes'] = $ingredientes;
        $produccion['componentes'] = $componentes;

        sendResponse(true, "Produccion obtenida", $produccion);
        break;

    case 'registrarProduccion':
        $producto_id = isset($datapost['producto_id']) ? (int)$datapost['producto_id'] : 0;
        $cantidad_producida = isset($datapost['cantidad_producida']) ? (float)$datapost['cantidad_producida'] : 0;
        $unidad = isset($datapost['unidad']) ? mysqli_real_escape_string($conn, $datapost['unidad']) : 'pza';
        $fecha = isset($datapost['fecha']) ? mysqli_real_escape_string($conn, $datapost['fecha']) : date('Y-m-d');
        $hora = isset($datapost['hora']) ? mysqli_real_escape_string($conn, $datapost['hora']) : date('H:i:s');
        $usuario_id = isset($datapost['usuario_id']) ? (int)$datapost['usuario_id'] : null;
        $notas = isset($datapost['notas']) ? mysqli_real_escape_string($conn, $datapost['notas']) : '';
        $ingredientes = isset($datapost['ingredientes']) ? $datapost['ingredientes'] : [];
        $componentes = isset($datapost['componentes']) ? $datapost['componentes'] : [];
        $descontar_inventario = isset($datapost['descontar_inventario']) ? (bool)$datapost['descontar_inventario'] : true;

        if ($producto_id <= 0) {
            sendResponse(false, "Producto no valido");
        }

        if ($cantidad_producida <= 0) {
            sendResponse(false, "La cantidad producida debe ser mayor a 0");
        }

        // Verificar que el producto existe y tiene receta
        $checkProd = mysqli_query($conn, "SELECT id, tiene_receta, stock FROM productos WHERE id = $producto_id AND activo = 1");
        if (!$checkProd || mysqli_num_rows($checkProd) == 0) {
            sendResponse(false, "Producto no encontrado");
        }

        mysqli_begin_transaction($conn);

        try {
            // Insertar produccion
            $usuario_value = $usuario_id ? $usuario_id : 'NULL';
            $sql = "INSERT INTO producciones (producto_id, cantidad_producida, unidad, fecha, hora, usuario_id, notas)
                    VALUES ($producto_id, $cantidad_producida, '$unidad', '$fecha', '$hora', $usuario_value, '$notas')";

            if (!mysqli_query($conn, $sql)) {
                throw new Exception("Error al registrar produccion: " . mysqli_error($conn));
            }

            $produccion_id = mysqli_insert_id($conn);

            // Insertar ingredientes usados
            foreach ($ingredientes as $ing) {
                $ingrediente_id = (int)$ing['ingrediente_id'];
                $cantidad_usada = (float)$ing['cantidad_usada'];
                $cantidad_receta = isset($ing['cantidad_receta']) ? (float)$ing['cantidad_receta'] : 0;
                $ing_unidad = mysqli_real_escape_string($conn, $ing['unidad'] ?? 'pza');

                if ($ingrediente_id > 0 && $cantidad_usada > 0) {
                    // Obtener precio del ingrediente
                    $costo_unitario = 0;
                    $costoResult = mysqli_query($conn, "SELECT precio FROM ingredientes WHERE id = $ingrediente_id");
                    if ($costoResult && $costoRow = mysqli_fetch_assoc($costoResult)) {
                        $costo_unitario = (float)$costoRow['precio'];
                    }

                    $sqlIng = "INSERT INTO produccion_ingredientes (produccion_id, ingrediente_id, cantidad_usada, cantidad_receta, unidad, costo_unitario)
                               VALUES ($produccion_id, $ingrediente_id, $cantidad_usada, $cantidad_receta, '$ing_unidad', $costo_unitario)";
                    if (!mysqli_query($conn, $sqlIng)) {
                        throw new Exception("Error al registrar ingrediente: " . mysqli_error($conn));
                    }

                    // Descontar del inventario de ingredientes
                    if ($descontar_inventario) {
                        mysqli_query($conn, "UPDATE ingredientes SET cantidad = cantidad - $cantidad_usada WHERE id = $ingrediente_id");
                    }
                }
            }

            // Insertar componentes usados
            foreach ($componentes as $comp) {
                $componente_id = (int)$comp['componente_id'];
                $cantidad_usada = (float)$comp['cantidad_usada'];
                $cantidad_receta = isset($comp['cantidad_receta']) ? (float)$comp['cantidad_receta'] : 0;
                $comp_unidad = mysqli_real_escape_string($conn, $comp['unidad'] ?? 'pza');

                if ($componente_id > 0 && $cantidad_usada > 0) {
                    // Obtener precio del componente
                    $costo_unitario = 0;
                    $precioResult = mysqli_query($conn, "SELECT precio FROM productos WHERE id = $componente_id");
                    if ($precioResult && $precioRow = mysqli_fetch_assoc($precioResult)) {
                        $costo_unitario = (float)$precioRow['precio'];
                    }

                    $sqlComp = "INSERT INTO produccion_componentes (produccion_id, componente_id, cantidad_usada, cantidad_receta, unidad, costo_unitario)
                                VALUES ($produccion_id, $componente_id, $cantidad_usada, $cantidad_receta, '$comp_unidad', $costo_unitario)";
                    if (!mysqli_query($conn, $sqlComp)) {
                        throw new Exception("Error al registrar componente: " . mysqli_error($conn));
                    }

                    // Descontar del inventario de productos
                    if ($descontar_inventario) {
                        mysqli_query($conn, "UPDATE productos SET stock = stock - $cantidad_usada WHERE id = $componente_id");
                    }
                }
            }

            // Aumentar stock del producto producido
            mysqli_query($conn, "UPDATE productos SET stock = stock + $cantidad_producida WHERE id = $producto_id");

            mysqli_commit($conn);
            sendResponse(true, "Produccion registrada correctamente", ['id' => $produccion_id]);

        } catch (Exception $e) {
            mysqli_rollback($conn);
            sendResponse(false, $e->getMessage());
        }
        break;

    case 'cancelarProduccion':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        $revertir_inventario = isset($datapost['revertir_inventario']) ? (bool)$datapost['revertir_inventario'] : true;

        if ($id <= 0) {
            sendResponse(false, "ID de produccion no valido");
        }

        // Verificar que existe y no está cancelada
        $check = mysqli_query($conn, "SELECT * FROM producciones WHERE id = $id AND estado = 'completada'");
        if (!$check || mysqli_num_rows($check) == 0) {
            sendResponse(false, "Produccion no encontrada o ya cancelada");
        }

        $produccion = mysqli_fetch_assoc($check);

        mysqli_begin_transaction($conn);

        try {
            // Marcar como cancelada
            mysqli_query($conn, "UPDATE producciones SET estado = 'cancelada', updated_at = NOW() WHERE id = $id");

            if ($revertir_inventario) {
                // Revertir stock del producto producido
                mysqli_query($conn, "UPDATE productos SET stock = stock - {$produccion['cantidad_producida']} WHERE id = {$produccion['producto_id']}");

                // Revertir ingredientes
                $ingResult = mysqli_query($conn, "SELECT ingrediente_id, cantidad_usada FROM produccion_ingredientes WHERE produccion_id = $id");
                while ($ing = mysqli_fetch_assoc($ingResult)) {
                    mysqli_query($conn, "UPDATE ingredientes SET cantidad = cantidad + {$ing['cantidad_usada']} WHERE id = {$ing['ingrediente_id']}");
                }

                // Revertir componentes
                $compResult = mysqli_query($conn, "SELECT componente_id, cantidad_usada FROM produccion_componentes WHERE produccion_id = $id");
                while ($comp = mysqli_fetch_assoc($compResult)) {
                    mysqli_query($conn, "UPDATE productos SET stock = stock + {$comp['cantidad_usada']} WHERE id = {$comp['componente_id']}");
                }
            }

            mysqli_commit($conn);
            sendResponse(true, "Produccion cancelada correctamente");

        } catch (Exception $e) {
            mysqli_rollback($conn);
            sendResponse(false, "Error al cancelar: " . $e->getMessage());
        }
        break;

    case 'getResumenProducciones':
        $fecha_inicio = isset($datapost['fecha_inicio']) ? mysqli_real_escape_string($conn, $datapost['fecha_inicio']) : date('Y-m-01');
        $fecha_fin = isset($datapost['fecha_fin']) ? mysqli_real_escape_string($conn, $datapost['fecha_fin']) : date('Y-m-d');

        // Total por producto
        $sql = "SELECT p.nombre, pr.unidad, SUM(pr.cantidad_producida) as total_producido,
                COUNT(pr.id) as num_producciones
                FROM producciones pr
                INNER JOIN productos p ON pr.producto_id = p.id
                WHERE pr.fecha BETWEEN '$fecha_inicio' AND '$fecha_fin'
                AND pr.estado = 'completada'
                GROUP BY pr.producto_id, pr.unidad
                ORDER BY total_producido DESC";

        $result = mysqli_query($conn, $sql);

        $resumen = [];
        if ($result) {
            while ($row = mysqli_fetch_assoc($result)) {
                $resumen[] = [
                    'producto' => $row['nombre'],
                    'unidad' => $row['unidad'],
                    'total_producido' => (float)$row['total_producido'],
                    'num_producciones' => (int)$row['num_producciones']
                ];
            }
        }

        // Total general
        $sqlTotal = "SELECT COUNT(*) as total_producciones FROM producciones
                     WHERE fecha BETWEEN '$fecha_inicio' AND '$fecha_fin' AND estado = 'completada'";
        $totalResult = mysqli_query($conn, $sqlTotal);
        $totalRow = mysqli_fetch_assoc($totalResult);

        sendResponse(true, "Resumen obtenido", [
            'por_producto' => $resumen,
            'total_producciones' => (int)$totalRow['total_producciones'],
            'fecha_inicio' => $fecha_inicio,
            'fecha_fin' => $fecha_fin
        ]);
        break;

    case 'getProduccionesHoy':
        $fecha = date('Y-m-d');

        $sql = "SELECT pr.id, pr.producto_id, pr.cantidad_producida, pr.unidad, pr.hora,
                p.nombre as producto_nombre
                FROM producciones pr
                INNER JOIN productos p ON pr.producto_id = p.id
                WHERE pr.fecha = '$fecha' AND pr.estado = 'completada'
                ORDER BY pr.created_at DESC";

        $result = mysqli_query($conn, $sql);

        $producciones = [];
        if ($result) {
            while ($row = mysqli_fetch_assoc($result)) {
                // Obtener ajustes de esta produccion
                $ajustesResult = mysqli_query($conn, "SELECT COUNT(*) as total FROM produccion_ajustes WHERE produccion_id = {$row['id']}");
                $ajustesRow = mysqli_fetch_assoc($ajustesResult);

                $producciones[] = [
                    'id' => (int)$row['id'],
                    'producto_id' => (int)$row['producto_id'],
                    'producto_nombre' => $row['producto_nombre'],
                    'cantidad_producida' => (float)$row['cantidad_producida'],
                    'unidad' => $row['unidad'],
                    'hora' => $row['hora'],
                    'num_ajustes' => (int)$ajustesRow['total']
                ];
            }
        }

        sendResponse(true, "Producciones de hoy", $producciones);
        break;

    case 'getAjustesProduccion':
        $produccion_id = isset($datapost['produccion_id']) ? (int)$datapost['produccion_id'] : 0;

        if ($produccion_id <= 0) {
            sendResponse(false, "ID de produccion no valido");
        }

        $sql = "SELECT pa.*, u.nombre as usuario_nombre
                FROM produccion_ajustes pa
                LEFT JOIN usuarios u ON pa.usuario_id = u.id
                WHERE pa.produccion_id = $produccion_id
                ORDER BY pa.created_at DESC";

        $result = mysqli_query($conn, $sql);

        $ajustes = [];
        if ($result) {
            while ($row = mysqli_fetch_assoc($result)) {
                // Obtener items del ajuste
                $itemsResult = mysqli_query($conn, "SELECT * FROM produccion_ajuste_items WHERE ajuste_id = {$row['id']}");
                $items = [];
                while ($itemRow = mysqli_fetch_assoc($itemsResult)) {
                    // Obtener nombre del item
                    if ($itemRow['tipo'] === 'ingrediente') {
                        $nombreResult = mysqli_query($conn, "SELECT nombre FROM ingredientes WHERE id = {$itemRow['item_id']}");
                    } else {
                        $nombreResult = mysqli_query($conn, "SELECT nombre FROM productos WHERE id = {$itemRow['item_id']}");
                    }
                    $nombreRow = mysqli_fetch_assoc($nombreResult);

                    $items[] = [
                        'id' => (int)$itemRow['id'],
                        'tipo' => $itemRow['tipo'],
                        'item_id' => (int)$itemRow['item_id'],
                        'nombre' => $nombreRow['nombre'] ?? 'Desconocido',
                        'cantidad' => (float)$itemRow['cantidad'],
                        'unidad' => $itemRow['unidad']
                    ];
                }

                $ajustes[] = [
                    'id' => (int)$row['id'],
                    'peso_inicial' => (float)$row['peso_inicial'],
                    'peso_final' => (float)$row['peso_final'],
                    'diferencia' => (float)$row['diferencia'],
                    'notas' => $row['notas'],
                    'usuario' => $row['usuario_nombre'],
                    'fecha' => $row['fecha'],
                    'hora' => $row['hora'],
                    'items' => $items
                ];
            }
        }

        sendResponse(true, "Ajustes obtenidos", $ajustes);
        break;

    case 'registrarAjusteProduccion':
        $produccion_id = isset($datapost['produccion_id']) ? (int)$datapost['produccion_id'] : 0;
        $peso_inicial = isset($datapost['peso_inicial']) ? (float)$datapost['peso_inicial'] : 0;
        $peso_final = isset($datapost['peso_final']) ? (float)$datapost['peso_final'] : 0;
        $notas = isset($datapost['notas']) ? mysqli_real_escape_string($conn, $datapost['notas']) : '';
        $usuario_id = isset($datapost['usuario_id']) ? (int)$datapost['usuario_id'] : null;
        $items = isset($datapost['items']) ? $datapost['items'] : [];
        $fecha = date('Y-m-d');
        $hora = date('H:i:s');

        if ($produccion_id <= 0) {
            sendResponse(false, "Produccion no valida");
        }

        // Verificar que la produccion existe
        $checkProd = mysqli_query($conn, "SELECT id FROM producciones WHERE id = $produccion_id AND estado = 'completada'");
        if (!$checkProd || mysqli_num_rows($checkProd) == 0) {
            sendResponse(false, "Produccion no encontrada");
        }

        mysqli_begin_transaction($conn);

        try {
            // Insertar ajuste
            $usuario_value = $usuario_id ? $usuario_id : 'NULL';
            $sql = "INSERT INTO produccion_ajustes (produccion_id, peso_inicial, peso_final, notas, usuario_id, fecha, hora)
                    VALUES ($produccion_id, $peso_inicial, $peso_final, '$notas', $usuario_value, '$fecha', '$hora')";

            if (!mysqli_query($conn, $sql)) {
                throw new Exception("Error al registrar ajuste: " . mysqli_error($conn));
            }

            $ajuste_id = mysqli_insert_id($conn);

            // Insertar items y descontar inventario
            foreach ($items as $item) {
                $tipo = mysqli_real_escape_string($conn, $item['tipo']);
                $item_id = (int)$item['item_id'];
                $cantidad = (float)$item['cantidad'];
                $unidad = mysqli_real_escape_string($conn, $item['unidad']);

                if ($item_id > 0 && $cantidad > 0) {
                    $sqlItem = "INSERT INTO produccion_ajuste_items (ajuste_id, tipo, item_id, cantidad, unidad)
                                VALUES ($ajuste_id, '$tipo', $item_id, $cantidad, '$unidad')";
                    if (!mysqli_query($conn, $sqlItem)) {
                        throw new Exception("Error al registrar item: " . mysqli_error($conn));
                    }

                    // Descontar del inventario
                    if ($tipo === 'ingrediente') {
                        mysqli_query($conn, "UPDATE ingredientes SET cantidad = cantidad - $cantidad WHERE id = $item_id");
                    } else {
                        mysqli_query($conn, "UPDATE productos SET stock = stock - $cantidad WHERE id = $item_id");
                    }
                }
            }

            // Actualizar cantidad producida si hay diferencia
            if ($peso_final > 0) {
                $diferencia = $peso_final - $peso_inicial;
                if ($diferencia != 0) {
                    // Obtener producto_id de la produccion
                    $prodResult = mysqli_query($conn, "SELECT producto_id FROM producciones WHERE id = $produccion_id");
                    $prodRow = mysqli_fetch_assoc($prodResult);
                    $producto_id = $prodRow['producto_id'];

                    // Ajustar stock del producto
                    mysqli_query($conn, "UPDATE productos SET stock = stock + $diferencia WHERE id = $producto_id");
                }
            }

            mysqli_commit($conn);
            sendResponse(true, "Ajuste registrado correctamente", ['id' => $ajuste_id]);

        } catch (Exception $e) {
            mysqli_rollback($conn);
            sendResponse(false, $e->getMessage());
        }
        break;

    case 'getReporteProducciones':
        $fecha_inicio = isset($datapost['fecha_inicio']) ? mysqli_real_escape_string($conn, $datapost['fecha_inicio']) : date('Y-m-01');
        $fecha_fin = isset($datapost['fecha_fin']) ? mysqli_real_escape_string($conn, $datapost['fecha_fin']) : date('Y-m-d');
        $producto_id = isset($datapost['producto_id']) ? (int)$datapost['producto_id'] : 0;

        // Obtener producciones con detalles
        $sql = "SELECT pr.id, pr.producto_id, pr.cantidad_producida, pr.unidad, pr.fecha, pr.hora,
                p.nombre as producto_nombre, IFNULL(p.rendimiento_receta, 1) as rendimiento_receta
                FROM producciones pr
                INNER JOIN productos p ON pr.producto_id = p.id
                WHERE pr.fecha BETWEEN '$fecha_inicio' AND '$fecha_fin'
                AND pr.estado = 'completada'";

        if ($producto_id > 0) {
            $sql .= " AND pr.producto_id = $producto_id";
        }

        $sql .= " ORDER BY pr.fecha DESC, pr.hora DESC";

        $result = mysqli_query($conn, $sql);

        if (!$result) {
            sendResponse(false, "Error en consulta principal: " . mysqli_error($conn));
        }

        $producciones = [];
        $totales = [
            'total_producciones' => 0,
            'desviacion_total_ingredientes' => 0,
            'desviacion_total_componentes' => 0,
            'costo_extra_total' => 0
        ];

        if ($result) {
            while ($row = mysqli_fetch_assoc($result)) {
                $prod_id = (int)$row['id'];
                $rendimiento_receta = (float)($row['rendimiento_receta'] ?: 1);
                $cantidad_producida = (float)$row['cantidad_producida'];

                // Obtener ingredientes de esta producción
                $sqlIng = "SELECT pi.ingrediente_id, pi.cantidad_usada, IFNULL(pi.cantidad_receta, 0) as cantidad_receta, pi.unidad, pi.costo_unitario,
                           i.nombre as ingrediente_nombre
                           FROM produccion_ingredientes pi
                           INNER JOIN ingredientes i ON pi.ingrediente_id = i.id
                           WHERE pi.produccion_id = $prod_id";
                $resultIng = mysqli_query($conn, $sqlIng);

                $ingredientes = [];
                $desviacion_ingredientes = 0;
                $costo_desviacion_ing = 0;
                $total_receta_ing = 0;
                $total_usado_ing = 0;

                if ($resultIng) {
                    while ($rowIng = mysqli_fetch_assoc($resultIng)) {
                        $cantidad_usada = (float)$rowIng['cantidad_usada'];
                        $cantidad_receta = (float)$rowIng['cantidad_receta'];
                        $desviacion = $cantidad_usada - $cantidad_receta;
                        $costo_unitario = (float)$rowIng['costo_unitario'];
                        $costo_desv = $desviacion * $costo_unitario;

                        $ingredientes[] = [
                            'id' => (int)$rowIng['ingrediente_id'],
                            'nombre' => $rowIng['ingrediente_nombre'],
                            'cantidad_usada' => $cantidad_usada,
                            'cantidad_receta' => $cantidad_receta,
                            'desviacion' => $desviacion,
                            'porcentaje_desviacion' => $cantidad_receta > 0 ? round(($desviacion / $cantidad_receta) * 100, 2) : 0,
                            'unidad' => $rowIng['unidad'],
                            'costo_unitario' => $costo_unitario,
                            'costo_desviacion' => $costo_desv
                        ];

                        $desviacion_ingredientes += $desviacion;
                        $costo_desviacion_ing += $costo_desv;
                        $total_receta_ing += $cantidad_receta;
                        $total_usado_ing += $cantidad_usada;
                    }
                }

                // Obtener componentes de esta producción
                $sqlComp = "SELECT pc.componente_id, pc.cantidad_usada, IFNULL(pc.cantidad_receta, 0) as cantidad_receta, pc.unidad, pc.costo_unitario,
                            p.nombre as componente_nombre
                            FROM produccion_componentes pc
                            INNER JOIN productos p ON pc.componente_id = p.id
                            WHERE pc.produccion_id = $prod_id";
                $resultComp = mysqli_query($conn, $sqlComp);

                $componentes = [];
                $desviacion_componentes = 0;
                $costo_desviacion_comp = 0;

                if ($resultComp) {
                    while ($rowComp = mysqli_fetch_assoc($resultComp)) {
                        $cantidad_usada = (float)$rowComp['cantidad_usada'];
                        $cantidad_receta = (float)$rowComp['cantidad_receta'];
                        $desviacion = $cantidad_usada - $cantidad_receta;
                        $costo_unitario = (float)$rowComp['costo_unitario'];
                        $costo_desv = $desviacion * $costo_unitario;

                        $componentes[] = [
                            'id' => (int)$rowComp['componente_id'],
                            'nombre' => $rowComp['componente_nombre'],
                            'cantidad_usada' => $cantidad_usada,
                            'cantidad_receta' => $cantidad_receta,
                            'desviacion' => $desviacion,
                            'porcentaje_desviacion' => $cantidad_receta > 0 ? round(($desviacion / $cantidad_receta) * 100, 2) : 0,
                            'unidad' => $rowComp['unidad'],
                            'costo_unitario' => $costo_unitario,
                            'costo_desviacion' => $costo_desv
                        ];

                        $desviacion_componentes += $desviacion;
                        $costo_desviacion_comp += $costo_desv;
                    }
                }

                // Obtener ajustes de esta producción
                $num_ajustes = 0;
                $total_diferencia = 0;
                $sqlAjustes = "SELECT COUNT(*) as num_ajustes, IFNULL(SUM(diferencia), 0) as total_diferencia
                               FROM produccion_ajustes WHERE produccion_id = $prod_id";
                $resultAjustes = mysqli_query($conn, $sqlAjustes);
                if ($resultAjustes) {
                    $rowAjustes = mysqli_fetch_assoc($resultAjustes);
                    $num_ajustes = (int)$rowAjustes['num_ajustes'];
                    $total_diferencia = (float)$rowAjustes['total_diferencia'];
                }

                $costo_total_desviacion = $costo_desviacion_ing + $costo_desviacion_comp;

                // Calcular rendimiento esperado basado en proporción de ingredientes usados
                // Si la receta dice: X ingredientes -> rendimiento_receta unidades de producto
                // Y usamos X' ingredientes -> rendimiento_esperado = (X'/X) * rendimiento_receta
                $rendimiento_esperado = $rendimiento_receta;
                if ($total_receta_ing > 0 && $rendimiento_receta > 0) {
                    $factor_proporcion = $total_usado_ing / $total_receta_ing;
                    $rendimiento_esperado = $factor_proporcion * $rendimiento_receta;
                }

                $desviacion_rendimiento = $cantidad_producida - $rendimiento_esperado;
                $porcentaje_rendimiento = $rendimiento_esperado > 0 ? round(($cantidad_producida / $rendimiento_esperado) * 100, 2) : 100;

                $producciones[] = [
                    'id' => $prod_id,
                    'producto_id' => (int)$row['producto_id'],
                    'producto_nombre' => $row['producto_nombre'],
                    'cantidad_producida' => $cantidad_producida,
                    'unidad' => $row['unidad'],
                    'fecha' => $row['fecha'],
                    'hora' => $row['hora'],
                    'ingredientes' => $ingredientes,
                    'componentes' => $componentes,
                    'rendimiento' => [
                        'receta_base' => $rendimiento_receta,
                        'esperado' => round($rendimiento_esperado, 3),
                        'real' => $cantidad_producida,
                        'desviacion' => round($desviacion_rendimiento, 3),
                        'porcentaje' => $porcentaje_rendimiento
                    ],
                    'resumen' => [
                        'total_ingredientes' => count($ingredientes),
                        'total_componentes' => count($componentes),
                        'desviacion_ingredientes' => $desviacion_ingredientes,
                        'desviacion_componentes' => $desviacion_componentes,
                        'costo_desviacion' => $costo_total_desviacion,
                        'num_ajustes' => $num_ajustes,
                        'ajuste_diferencia' => $total_diferencia
                    ]
                ];

                $totales['total_producciones']++;
                $totales['costo_extra_total'] += $costo_total_desviacion;
            }
        }

        // Calcular rendimiento por producto usando las producciones ya procesadas
        // Esto permite calcular desviaciones absolutas (no se cancelan entre sí)
        $rendimiento_temp = [];
        foreach ($producciones as $prod) {
            $pid = $prod['producto_id'];
            if (!isset($rendimiento_temp[$pid])) {
                $rendimiento_temp[$pid] = [
                    'producto_id' => $pid,
                    'producto_nombre' => $prod['producto_nombre'],
                    'unidad' => $prod['unidad'],
                    'num_producciones' => 0,
                    'total_producido' => 0,
                    'desviacion_neta' => 0,        // Puede ser + o - (se cancelan)
                    'desviacion_absoluta' => 0,    // Siempre positiva (no se cancelan)
                    'producciones_sobre' => 0,     // Cuántas produjeron de más
                    'producciones_bajo' => 0       // Cuántas produjeron de menos
                ];
            }

            $rendimiento_temp[$pid]['num_producciones']++;
            $rendimiento_temp[$pid]['total_producido'] += $prod['cantidad_producida'];

            // Desviación de rendimiento de esta producción
            $desv_rend = $prod['rendimiento']['desviacion'];
            $rendimiento_temp[$pid]['desviacion_neta'] += $desv_rend;
            $rendimiento_temp[$pid]['desviacion_absoluta'] += abs($desv_rend);

            if ($desv_rend > 0) {
                $rendimiento_temp[$pid]['producciones_sobre']++;
            } elseif ($desv_rend < 0) {
                $rendimiento_temp[$pid]['producciones_bajo']++;
            }
        }

        // Convertir a array y calcular eficiencia
        $rendimiento_por_producto = [];
        foreach ($rendimiento_temp as $rend) {
            $rend['eficiencia'] = $rend['num_producciones'] > 0
                ? round((($rend['num_producciones'] - $rend['producciones_bajo']) / $rend['num_producciones']) * 100, 2)
                : 100;
            $rendimiento_por_producto[] = $rend;
        }

        // Ordenar por total producido
        usort($rendimiento_por_producto, function($a, $b) {
            return $b['total_producido'] <=> $a['total_producido'];
        });

        sendResponse(true, "Reporte generado", [
            'producciones' => $producciones,
            'rendimiento_por_producto' => $rendimiento_por_producto,
            'totales' => $totales,
            'filtros' => [
                'fecha_inicio' => $fecha_inicio,
                'fecha_fin' => $fecha_fin,
                'producto_id' => $producto_id
            ]
        ]);
        break;

    default:
        sendResponse(false, "Operacion no valida en Producciones");
        break;
}
