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

switch ($tipo) {
    case 'getRastreoInventario':
        $fecha_inicio = isset($datapost['fecha_inicio']) ? $datapost['fecha_inicio'] : date('Y-m-d');
        $fecha_fin = isset($datapost['fecha_fin']) ? $datapost['fecha_fin'] : date('Y-m-d');
        $sucursal = isset($datapost['sucursal']) ? mysqli_real_escape_string($conn, $datapost['sucursal']) : '';
        $caja = isset($datapost['caja']) ? mysqli_real_escape_string($conn, $datapost['caja']) : '';

        $fi = mysqli_real_escape_string($conn, $fecha_inicio);
        $ff = mysqli_real_escape_string($conn, $fecha_fin);
        $ffNext = date('Y-m-d', strtotime($fecha_fin . ' +1 day'));

        // ========== PRODUCTOS ==========
        $sql_prod = "SELECT id, nombre, unidad, stock FROM productos WHERE activo = 1 AND (contabilizar_corte = 1 OR contar_al_inicio = 1) ORDER BY nombre";
        $result_prod = mysqli_query($conn, $sql_prod);
        if (!$result_prod) {
            sendResponse(false, "Error al obtener productos: " . mysqli_error($conn));
        }

        $productos = [];
        while ($row = mysqli_fetch_assoc($result_prod)) {
            $pid = (int)$row['id'];
            $productos[$pid] = [
                'id' => $pid,
                'tipo' => 'producto',
                'nombre' => $row['nombre'],
                'unidad' => $row['unidad'],
                'stock_actual' => (float)$row['stock'],
                'stock_inicial' => null,
                'stock_final' => null,
                'ventas' => 0,
                'compras' => 0,
                'produccion' => 0,
                'consumo_produccion' => 0,
                'mermas' => 0,
                'transferencias_entrada' => 0,
                'transferencias_salida' => 0,
                'ajuste_turno' => null,
                'ajuste_corte' => null,
            ];
        }

        if (!empty($productos)) {
            $pids = implode(',', array_keys($productos));

            // 1) Stock inicial del turno (primer turno del periodo)
            $sql = "SELECT ti.producto_id, ti.stock_sistema, ti.stock_fisico, ti.diferencia
                    FROM turno_inventario ti
                    INNER JOIN turnos t ON ti.turno_id = t.id
                    WHERE t.fecha_inicio >= '$fi' AND t.fecha_inicio < '$ffNext'";
            if (!empty($sucursal)) $sql .= " AND t.sucursal = '$sucursal'";
            if (!empty($caja)) $sql .= " AND t.caja = '$caja'";
            $sql .= " AND ti.producto_id IN ($pids)
                      ORDER BY t.fecha_inicio ASC";
            $r = mysqli_query($conn, $sql);
            $turnoVisto = [];
            while ($r && $row = mysqli_fetch_assoc($r)) {
                $pid = (int)$row['producto_id'];
                if (!isset($turnoVisto[$pid]) && isset($productos[$pid])) {
                    $productos[$pid]['stock_inicial'] = (float)$row['stock_fisico'];
                    $productos[$pid]['ajuste_turno'] = (float)$row['diferencia'];
                    $turnoVisto[$pid] = true;
                }
            }

            // 2) Stock final del corte (ultimo corte del periodo)
            $sql = "SELECT ic.producto_id, ic.stock_esperado, ic.stock_fisico, ic.diferencia
                    FROM inventario_cortes ic
                    INNER JOIN cortes_caja cc ON ic.corte_id = cc.id
                    WHERE cc.fecha_fin >= '$fi' AND cc.fecha_fin < '$ffNext'";
            if (!empty($sucursal)) $sql .= " AND cc.sucursal = '$sucursal'";
            if (!empty($caja)) $sql .= " AND cc.caja = '$caja'";
            $sql .= " AND ic.producto_id IN ($pids)
                      ORDER BY cc.fecha_fin DESC";
            $r = mysqli_query($conn, $sql);
            $corteVisto = [];
            while ($r && $row = mysqli_fetch_assoc($r)) {
                $pid = (int)$row['producto_id'];
                if (!isset($corteVisto[$pid]) && isset($productos[$pid])) {
                    $productos[$pid]['stock_final'] = (float)$row['stock_fisico'];
                    $productos[$pid]['ajuste_corte'] = (float)$row['diferencia'];
                    $corteVisto[$pid] = true;
                }
            }

            // 3) Ventas
            $sql = "SELECT vd.producto_id, SUM(vd.cantidad) as total
                    FROM venta_detalle vd
                    INNER JOIN ventas v ON vd.venta_id = v.id
                    WHERE v.estado = 'completada'
                    AND v.fecha >= '$fi' AND v.fecha < '$ffNext'";
            if (!empty($sucursal)) $sql .= " AND v.sucursal = '$sucursal'";
            $sql .= " AND vd.producto_id IN ($pids)
                      GROUP BY vd.producto_id";
            $r = mysqli_query($conn, $sql);
            while ($r && $row = mysqli_fetch_assoc($r)) {
                $pid = (int)$row['producto_id'];
                if (isset($productos[$pid])) {
                    $productos[$pid]['ventas'] = (float)$row['total'];
                }
            }

            // 4) Compras de productos
            $sql = "SELECT ci.item_id as producto_id, SUM(ci.cantidad) as total
                    FROM compra_items ci
                    INNER JOIN compras c ON ci.compra_id = c.id
                    WHERE ci.tipo_item = 'producto'
                    AND c.fecha >= '$fi' AND c.fecha <= '$ff'
                    AND ci.item_id IN ($pids)
                    GROUP BY ci.item_id";
            $r = mysqli_query($conn, $sql);
            while ($r && $row = mysqli_fetch_assoc($r)) {
                $pid = (int)$row['producto_id'];
                if (isset($productos[$pid])) {
                    $productos[$pid]['compras'] = (float)$row['total'];
                }
            }

            // 5) Producciones (productos producidos)
            $sql = "SELECT producto_id, SUM(cantidad_producida) as total
                    FROM producciones
                    WHERE estado = 'completada'
                    AND fecha >= '$fi' AND fecha <= '$ff'
                    AND producto_id IN ($pids)
                    GROUP BY producto_id";
            $r = mysqli_query($conn, $sql);
            while ($r && $row = mysqli_fetch_assoc($r)) {
                $pid = (int)$row['producto_id'];
                if (isset($productos[$pid])) {
                    $productos[$pid]['produccion'] = (float)$row['total'];
                }
            }

            // 5b) Consumo de productos como componentes en producciones
            $sql = "SELECT pc.componente_id as producto_id, SUM(pc.cantidad_usada) as total
                    FROM produccion_componentes pc
                    INNER JOIN producciones p ON pc.produccion_id = p.id
                    WHERE p.estado = 'completada'
                    AND p.fecha >= '$fi' AND p.fecha <= '$ff'
                    AND pc.componente_id IN ($pids)
                    GROUP BY pc.componente_id";
            $r = mysqli_query($conn, $sql);
            while ($r && $row = mysqli_fetch_assoc($r)) {
                $pid = (int)$row['producto_id'];
                if (isset($productos[$pid])) {
                    $productos[$pid]['consumo_produccion'] = (float)$row['total'];
                }
            }

            // 6) Mermas de productos
            $sql = "SELECT item_id as producto_id, SUM(cantidad) as total
                    FROM mermas
                    WHERE tipo_item = 'producto'
                    AND fecha >= '$fi' AND fecha <= '$ff'
                    AND item_id IN ($pids)
                    GROUP BY item_id";
            $r = mysqli_query($conn, $sql);
            while ($r && $row = mysqli_fetch_assoc($r)) {
                $pid = (int)$row['producto_id'];
                if (isset($productos[$pid])) {
                    $productos[$pid]['mermas'] = (float)$row['total'];
                }
            }

            // 7) Transferencias de productos
            if (!empty($sucursal)) {
                // Entradas
                $sql = "SELECT ti2.item_id as producto_id, SUM(ti2.cantidad_recibida) as total
                        FROM transferencia_items ti2
                        INNER JOIN transferencias t2 ON ti2.transferencia_id = t2.id
                        WHERE t2.estado = 'recibida'
                        AND t2.sucursal_destino_nombre = '$sucursal'
                        AND t2.fecha >= '$fi' AND t2.fecha <= '$ff'
                        AND ti2.tipo_item = 'producto'
                        AND ti2.item_id IN ($pids)
                        GROUP BY ti2.item_id";
                $r = mysqli_query($conn, $sql);
                while ($r && $row = mysqli_fetch_assoc($r)) {
                    $pid = (int)$row['producto_id'];
                    if (isset($productos[$pid])) {
                        $productos[$pid]['transferencias_entrada'] = (float)$row['total'];
                    }
                }

                // Salidas
                $sql = "SELECT ti2.item_id as producto_id, SUM(ti2.cantidad_enviada) as total
                        FROM transferencia_items ti2
                        INNER JOIN transferencias t2 ON ti2.transferencia_id = t2.id
                        WHERE t2.estado IN ('enviada', 'recibida')
                        AND t2.sucursal_origen_nombre = '$sucursal'
                        AND t2.fecha >= '$fi' AND t2.fecha <= '$ff'
                        AND ti2.tipo_item = 'producto'
                        AND ti2.item_id IN ($pids)
                        GROUP BY ti2.item_id";
                $r = mysqli_query($conn, $sql);
                while ($r && $row = mysqli_fetch_assoc($r)) {
                    $pid = (int)$row['producto_id'];
                    if (isset($productos[$pid])) {
                        $productos[$pid]['transferencias_salida'] = (float)$row['total'];
                    }
                }
            }
        }

        // ========== INGREDIENTES ==========
        $sql_ing = "SELECT id, nombre, unidad, cantidad as stock FROM ingredientes WHERE activo = 1 ORDER BY nombre";
        $result_ing = mysqli_query($conn, $sql_ing);

        $ingredientes = [];
        if ($result_ing) {
            while ($row = mysqli_fetch_assoc($result_ing)) {
                $iid = (int)$row['id'];
                $ingredientes[$iid] = [
                    'id' => $iid,
                    'tipo' => 'ingrediente',
                    'nombre' => $row['nombre'],
                    'unidad' => $row['unidad'],
                    'stock_actual' => (float)$row['stock'],
                    'stock_inicial' => null,
                    'stock_final' => null,
                    'ventas' => 0,
                    'compras' => 0,
                    'produccion' => 0,
                    'consumo_produccion' => 0,
                    'mermas' => 0,
                    'transferencias_entrada' => 0,
                    'transferencias_salida' => 0,
                    'ajuste_turno' => null,
                    'ajuste_corte' => null,
                ];
            }
        }

        if (!empty($ingredientes)) {
            $iids = implode(',', array_keys($ingredientes));

            // Stock inicial: primer conteo del periodo
            $sql = "SELECT cid.ingrediente_id, cid.stock_fisico
                    FROM conteo_ingredientes_detalle cid
                    INNER JOIN conteos_ingredientes ci ON cid.conteo_id = ci.id
                    WHERE ci.fecha >= '$fi' AND ci.fecha < '$ffNext'";
            if (!empty($sucursal)) $sql .= " AND ci.sucursal = '$sucursal'";
            $sql .= " AND cid.ingrediente_id IN ($iids)
                      ORDER BY ci.fecha ASC";
            $r = mysqli_query($conn, $sql);
            $conteoInicialVisto = [];
            while ($r && $row = mysqli_fetch_assoc($r)) {
                $iid = (int)$row['ingrediente_id'];
                if (!isset($conteoInicialVisto[$iid]) && isset($ingredientes[$iid])) {
                    $ingredientes[$iid]['stock_inicial'] = (float)$row['stock_fisico'];
                    $conteoInicialVisto[$iid] = true;
                }
            }

            // Stock final: ultimo conteo del periodo
            $sql = "SELECT cid.ingrediente_id, cid.stock_fisico
                    FROM conteo_ingredientes_detalle cid
                    INNER JOIN conteos_ingredientes ci ON cid.conteo_id = ci.id
                    WHERE ci.fecha >= '$fi' AND ci.fecha < '$ffNext'";
            if (!empty($sucursal)) $sql .= " AND ci.sucursal = '$sucursal'";
            $sql .= " AND cid.ingrediente_id IN ($iids)
                      ORDER BY ci.fecha DESC";
            $r = mysqli_query($conn, $sql);
            $conteoFinalVisto = [];
            while ($r && $row = mysqli_fetch_assoc($r)) {
                $iid = (int)$row['ingrediente_id'];
                if (!isset($conteoFinalVisto[$iid]) && isset($ingredientes[$iid])) {
                    $ingredientes[$iid]['stock_final'] = (float)$row['stock_fisico'];
                    $conteoFinalVisto[$iid] = true;
                }
            }

            // Compras de ingredientes
            $sql = "SELECT ci.item_id as ingrediente_id, SUM(ci.cantidad) as total
                    FROM compra_items ci
                    INNER JOIN compras c ON ci.compra_id = c.id
                    WHERE ci.tipo_item = 'ingrediente'
                    AND c.fecha >= '$fi' AND c.fecha <= '$ff'
                    AND ci.item_id IN ($iids)
                    GROUP BY ci.item_id";
            $r = mysqli_query($conn, $sql);
            while ($r && $row = mysqli_fetch_assoc($r)) {
                $iid = (int)$row['ingrediente_id'];
                if (isset($ingredientes[$iid])) {
                    $ingredientes[$iid]['compras'] = (float)$row['total'];
                }
            }

            // Consumo de ingredientes en producciones
            $sql = "SELECT pi2.ingrediente_id, SUM(pi2.cantidad_usada) as total
                    FROM produccion_ingredientes pi2
                    INNER JOIN producciones p ON pi2.produccion_id = p.id
                    WHERE p.estado = 'completada'
                    AND p.fecha >= '$fi' AND p.fecha <= '$ff'
                    AND pi2.ingrediente_id IN ($iids)
                    GROUP BY pi2.ingrediente_id";
            $r = mysqli_query($conn, $sql);
            while ($r && $row = mysqli_fetch_assoc($r)) {
                $iid = (int)$row['ingrediente_id'];
                if (isset($ingredientes[$iid])) {
                    $ingredientes[$iid]['consumo_produccion'] = (float)$row['total'];
                }
            }

            // Mermas de ingredientes
            $sql = "SELECT item_id as ingrediente_id, SUM(cantidad) as total
                    FROM mermas
                    WHERE tipo_item = 'ingrediente'
                    AND fecha >= '$fi' AND fecha <= '$ff'
                    AND item_id IN ($iids)
                    GROUP BY item_id";
            $r = mysqli_query($conn, $sql);
            while ($r && $row = mysqli_fetch_assoc($r)) {
                $iid = (int)$row['ingrediente_id'];
                if (isset($ingredientes[$iid])) {
                    $ingredientes[$iid]['mermas'] = (float)$row['total'];
                }
            }

            // Transferencias de ingredientes
            if (!empty($sucursal)) {
                // Entradas
                $sql = "SELECT ti2.item_id as ingrediente_id, SUM(ti2.cantidad_recibida) as total
                        FROM transferencia_items ti2
                        INNER JOIN transferencias t2 ON ti2.transferencia_id = t2.id
                        WHERE t2.estado = 'recibida'
                        AND t2.sucursal_destino_nombre = '$sucursal'
                        AND t2.fecha >= '$fi' AND t2.fecha <= '$ff'
                        AND ti2.tipo_item = 'ingrediente'
                        AND ti2.item_id IN ($iids)
                        GROUP BY ti2.item_id";
                $r = mysqli_query($conn, $sql);
                while ($r && $row = mysqli_fetch_assoc($r)) {
                    $iid = (int)$row['ingrediente_id'];
                    if (isset($ingredientes[$iid])) {
                        $ingredientes[$iid]['transferencias_entrada'] = (float)$row['total'];
                    }
                }

                // Salidas
                $sql = "SELECT ti2.item_id as ingrediente_id, SUM(ti2.cantidad_enviada) as total
                        FROM transferencia_items ti2
                        INNER JOIN transferencias t2 ON ti2.transferencia_id = t2.id
                        WHERE t2.estado IN ('enviada', 'recibida')
                        AND t2.sucursal_origen_nombre = '$sucursal'
                        AND t2.fecha >= '$fi' AND t2.fecha <= '$ff'
                        AND ti2.tipo_item = 'ingrediente'
                        AND ti2.item_id IN ($iids)
                        GROUP BY ti2.item_id";
                $r = mysqli_query($conn, $sql);
                while ($r && $row = mysqli_fetch_assoc($r)) {
                    $iid = (int)$row['ingrediente_id'];
                    if (isset($ingredientes[$iid])) {
                        $ingredientes[$iid]['transferencias_salida'] = (float)$row['total'];
                    }
                }
            }
        }

        // ========== CALCULAR ESPERADO Y DISCREPANCIA ==========
        $resultado = [];

        // Productos
        foreach ($productos as $p) {
            $inicial = $p['stock_inicial'];
            if ($inicial !== null) {
                $esperado = $inicial
                    + $p['compras']
                    + $p['produccion']
                    + $p['transferencias_entrada']
                    - $p['ventas']
                    - $p['consumo_produccion']
                    - $p['transferencias_salida']
                    - $p['mermas'];
                $p['stock_esperado'] = round($esperado, 2);

                if ($p['stock_final'] !== null) {
                    $p['discrepancia'] = round($p['stock_final'] - $esperado, 2);
                } else {
                    $p['discrepancia'] = null;
                }
            } else {
                $p['stock_esperado'] = null;
                $p['discrepancia'] = null;
            }
            $resultado[] = $p;
        }

        // Ingredientes
        foreach ($ingredientes as $ing) {
            $inicial = $ing['stock_inicial'];
            if ($inicial !== null) {
                $esperado = $inicial
                    + $ing['compras']
                    + $ing['transferencias_entrada']
                    - $ing['consumo_produccion']
                    - $ing['transferencias_salida']
                    - $ing['mermas'];
                $ing['stock_esperado'] = round($esperado, 2);

                if ($ing['stock_final'] !== null) {
                    $ing['discrepancia'] = round($ing['stock_final'] - $esperado, 2);
                } else {
                    $ing['discrepancia'] = null;
                }
            } else {
                $ing['stock_esperado'] = null;
                $ing['discrepancia'] = null;
            }
            $resultado[] = $ing;
        }

        sendResponse(true, "Rastreo obtenido", $resultado);
        break;

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