<?php

// Endpoint para crear un pedido para llevar
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'crearPedidoLlevar') {
  $datosPedido = isset($datapost['datosPedido']) ? $datapost['datosPedido'] : null;

  if (empty($datosPedido)) {
    sendResponse(false, "Debe proporcionar los datos del pedido para llevar");
  }

  try {
    // Iniciar transacción
    $conn->begin_transaction();

    // Extraer datos necesarios
    $clienteLlevar = isset($datosPedido['clienteLlevar']) ? $datosPedido['clienteLlevar'] : 'Cliente General';
    $usuario = isset($datosPedido['usuario']) ? $datosPedido['usuario'] : 'admin';

    // Obtener fecha del último corte para la función inserta_pedido
    $queryFechaCorte = "SELECT CONCAT(fecha, ' ', hora) as fechaCorte FROM corte ORDER BY idCorte DESC LIMIT 1";
    $resultFechaCorte = $conn->query($queryFechaCorte);

    if ($resultFechaCorte && $resultFechaCorte->num_rows > 0) {
      $rowFechaCorte = $resultFechaCorte->fetch_assoc();
      $fechaUltimoCorte = $rowFechaCorte['fechaCorte'];
    } else {
      // Si no hay cortes previos, usar una fecha predeterminada
      $fechaUltimoCorte = '2000-01-01 00:00:00';
    }

    $fechaUltimoCorte = date('Ymd H:i:s', strtotime($fechaUltimoCorte));

    // Preparar parámetros para la función inserta_pedido
    $tPedido = '3'; // 1 = mesa, 2 = domicilio, 3 = llevar
    $hoy = date('Y-m-d');
    $hora = date('H:i:s');
    $status = 'abierto';

    // Llamar a la función inserta_pedido
    $query = "SELECT inserta_pedido(?, ?, ?, ?, ?, ?) as numeroPedido";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("ssssss", $fechaUltimoCorte, $tPedido, $hoy, $hora, $status, $usuario);
    $stmt->execute();
    $result = $stmt->get_result();

    if (!$result) {
      throw new Exception("Error al ejecutar la función inserta_pedido: " . $conn->error);
    }

    $row = $result->fetch_assoc();

    if (!$row || !isset($row['numeroPedido'])) {
      throw new Exception("Error al obtener el número de pedido");
    }

    $numeroPedido = $row['numeroPedido'];

    // Obtener el ID del pedido recién creado
    $queryPedidoID = "SELECT idPedido FROM pedido WHERE numero = ? ORDER BY idPedido DESC LIMIT 1";
    $stmtPedidoID = $conn->prepare($queryPedidoID);
    $stmtPedidoID->bind_param("i", $numeroPedido);
    $stmtPedidoID->execute();
    $resultPedidoID = $stmtPedidoID->get_result();

    if (!$resultPedidoID || $resultPedidoID->num_rows === 0) {
      throw new Exception("No se pudo encontrar el pedido recién creado");
    }

    $rowPedidoID = $resultPedidoID->fetch_assoc();
    $idPedido = $rowPedidoID['idPedido'];

    // Actualizar información adicional del pedido
    $queryUpdate = "UPDATE pedido SET 
                    clienteLlevar = ?,
                    tipo = 'llevar'
                    WHERE idPedido = ?";
    $stmtUpdate = $conn->prepare($queryUpdate);
    $stmtUpdate->bind_param("si", $clienteLlevar, $idPedido);

    if (!$stmtUpdate->execute()) {
      throw new Exception("Error al actualizar información del pedido: " . $stmtUpdate->error);
    }

    // Confirmar la transacción
    $conn->commit();

    // Obtener los datos completos del pedido creado
    $queryPedido = "SELECT * FROM pedido WHERE idPedido = ?";
    $stmtPedido = $conn->prepare($queryPedido);
    $stmtPedido->bind_param("i", $idPedido);
    $stmtPedido->execute();
    $resultPedido = $stmtPedido->get_result();
    $pedidoCreado = $resultPedido->fetch_assoc();

    sendResponse(true, "Pedido para llevar creado correctamente", $pedidoCreado);
  } catch (Exception $e) {
    // Revertir cambios en caso de error
    $conn->rollback();
    sendResponse(false, "Error al crear el pedido para llevar: " . $e->getMessage());
  }
}
// Endpoint para actualizar un pedido para llevar
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'actualizarPedidoLlevar') {
  $datosPedido = isset($datapost['datosPedido']) ? $datapost['datosPedido'] : null;

  if (empty($datosPedido) || empty($datosPedido['idPedido'])) {
    sendResponse(false, "Debe proporcionar los datos del pedido y su ID");
  }

  try {
    $idPedido = $datosPedido['idPedido'];
    $clienteLlevar = isset($datosPedido['clienteLlevar']) ? $datosPedido['clienteLlevar'] : 'Cliente General';

    // Actualizar información básica del pedido
    $queryUpdate = "UPDATE pedido SET 
                    clienteLlevar = ?
                    WHERE idPedido = ?";
    $stmtUpdate = $conn->prepare($queryUpdate);
    $stmtUpdate->bind_param("si", $clienteLlevar, $idPedido);
    $stmtUpdate->execute();

    // Si se proporcionan nuevos detalles, actualizarlos (similar a actualizarPedido)
    if (isset($datosPedido['detalles']) && is_array($datosPedido['detalles'])) {
      // Código similar al de actualizarPedido
      // ...
    }

    // Obtener los datos actualizados del pedido
    $queryPedido = "SELECT * FROM pedido WHERE idPedido = ?";
    $stmtPedido = $conn->prepare($queryPedido);
    $stmtPedido->bind_param("i", $idPedido);
    $stmtPedido->execute();
    $resultPedido = $stmtPedido->get_result();
    $pedidoActualizado = $resultPedido->fetch_assoc();

    sendResponse(true, "Pedido para llevar actualizado correctamente", $pedidoActualizado);
  } catch (Exception $e) {
    sendResponse(false, "Error al actualizar el pedido para llevar: " . $e->getMessage());
  }
}
// Endpoint para agregar un producto a un pedido para llevar
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'agregarProductoPedidoLlevar') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;
  $producto = isset($datapost['producto']) ? $datapost['producto'] : null;

  if (empty($idPedido) || empty($producto)) {
    sendResponse(false, "Debe proporcionar el ID del pedido y los datos del producto");
  }

  try {
    // Obtener número del pedido
    $queryPedido = "SELECT numero FROM pedido WHERE idPedido = ? AND tipo = 'llevar' LIMIT 1";
    $stmtPedido = $conn->prepare($queryPedido);
    $stmtPedido->bind_param("i", $idPedido);
    $stmtPedido->execute();
    $resultPedido = $stmtPedido->get_result();

    if ($resultPedido->num_rows === 0) {
      sendResponse(false, "Pedido para llevar no encontrado");
    }

    $pedidoData = $resultPedido->fetch_assoc();
    $numeroPedido = $pedidoData['numero'];

    // Insertar el producto (mismo código que agregarProductoPedido)
    $queryInsert = "INSERT INTO pedido_detalle (
                      idPedido, 
                      pedido, 
                      idPlatillo, 
                      nombrePlatillo, 
                      cantidad, 
                      precio, 
                      idCategoria, 
                      nombreCategoria, 
                      costo, 
                      status, 
                      enviadoServicio
                    ) VALUES (
                      ?, ?, ?, ?, ?, ?, ?, ?, ?, 'activo', 0
                    )";

    $stmtInsert = $conn->prepare($queryInsert);
    $idCategoria = $producto['idCategoria'] ?? 0;
    $nombreCategoria = $producto['nombreCategoria'] ?? '';
    $stmtInsert->bind_param(
      "iiisddiss",
      $idPedido,
      $numeroPedido,
      $producto['idPlatillo'],
      $producto['nombrePlatillo'],
      $producto['cantidad'],
      $producto['precio'],
      $idCategoria,
      $nombreCategoria,
      $producto['costo']
    );
    $stmtInsert->execute();

    $idPedidoDetalle = $conn->insert_id;

    // Insertar observaciones si existen
    if (isset($producto['observaciones']) && is_array($producto['observaciones']) && count($producto['observaciones']) > 0) {
      // Código similar al de agregarProductoPedido
      // ...
    }

    sendResponse(true, "Producto agregado correctamente al pedido para llevar");
  } catch (Exception $e) {
    sendResponse(false, "Error al agregar producto al pedido para llevar: " . $e->getMessage());
  }
}
// Endpoint para obtener un pedido para llevar por ID
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPedidoLlevar') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;

  if (empty($idPedido)) {
    sendResponse(false, "Debe proporcionar el ID del pedido para llevar");
  }

  try {
    // Consultar datos del pedido
    $queryPedido = "SELECT * FROM pedido WHERE idPedido = ? AND tipo = 'llevar' LIMIT 1";
    $stmtPedido = $conn->prepare($queryPedido);
    $stmtPedido->bind_param("i", $idPedido);
    $stmtPedido->execute();
    $resultPedido = $stmtPedido->get_result();

    if ($resultPedido->num_rows === 0) {
      sendResponse(false, "Pedido para llevar no encontrado");
    }

    $pedidoData = $resultPedido->fetch_assoc();

    // Obtener detalles del pedido
    $queryDetalles = "SELECT * FROM pedido_detalle WHERE idPedido = ?";
    $stmtDetalles = $conn->prepare($queryDetalles);
    $stmtDetalles->bind_param("i", $idPedido);
    $stmtDetalles->execute();
    $resultDetalles = $stmtDetalles->get_result();

    $detalles = [];
    while ($detalle = $resultDetalles->fetch_assoc()) {
      // Obtener observaciones si existen
      $queryObservaciones = "SELECT * FROM observacion_detalle WHERE idPedidoDetalle = ?";
      $stmtObservaciones = $conn->prepare($queryObservaciones);
      $stmtObservaciones->bind_param("i", $detalle['idPedidoDetalle']);
      $stmtObservaciones->execute();
      $resultObservaciones = $stmtObservaciones->get_result();

      $observaciones = [];
      while ($obs = $resultObservaciones->fetch_assoc()) {
        $observaciones[] = $obs['txt'];
      }

      $detalles[] = [
        'idPedidoDetalle' => (int) $detalle['idPedidoDetalle'],
        'idPlatillo' => (int) $detalle['idPlatillo'],
        'nombrePlatillo' => $detalle['nombrePlatillo'],
        'cantidad' => (float) $detalle['cantidad'],
        'precio' => (float) $detalle['precio'],
        'idCategoria' => (int) $detalle['idCategoria'],
        'nombreCategoria' => $detalle['nombreCategoria'],
        'costo' => (float) $detalle['costo'],
        'status' => $detalle['status'],
        'observaciones' => $observaciones
      ];
    }

    // Convertir a tipos correctos
    $pedidoProcessed = [
      'idPedido' => (int) $pedidoData['idPedido'],
      'numero' => (int) $pedidoData['numero'],
      'numeroDia' => (int) $pedidoData['numeroDia'],
      'fechaCreacion' => $pedidoData['fechaCreacion'],
      'tipo' => $pedidoData['tipo'],
      'status' => $pedidoData['status'],
      'horaAbierto' => $pedidoData['horaAbierto'],
      'horaCerrado' => $pedidoData['horaCerrado'],
      'horaEnvio' => $pedidoData['horaEnvio'],
      'usuario' => $pedidoData['usuario'],
      'liquidado' => $pedidoData['liquidado'],
      'clienteLlevar' => $pedidoData['clienteLlevar'],
      'detalles' => $detalles
    ];

    sendResponse(true, "Pedido para llevar encontrado", $pedidoProcessed);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener pedido para llevar: " . $e->getMessage());
  }
}

// Endpoint para obtener todos los pedidos para llevar según su estado
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPedidosLlevar') {
  $estado = isset($datapost['estado']) ? $datapost['estado'] : 'abiertos';

  try {
    // Convertir el estado a valores de status en la base de datos
    $statusFilter = '';
    switch ($estado) {
      case 'abiertos':
        $statusFilter = "'abierto'";
        break;
      case 'pendientes':
        $statusFilter = "'pendiente'";
        break;
      case 'pagados':
        $statusFilter = "'pagado', 'finalizado'";
        break;
      default:
        $statusFilter = "'abierto'";
    }

    // Construir la consulta
    $query = "SELECT p.* FROM pedido p 
              WHERE p.tipo = 'llevar' AND p.status IN ($statusFilter) 
              ORDER BY p.idPedido DESC";

    $result = $conn->query($query);

    $pedidos = [];
    while ($row = $result->fetch_assoc()) {
      $pedidoItem = [
        'idPedido' => (int) $row['idPedido'],
        'numero' => (int) $row['numero'],
        'numeroDia' => (int) $row['numeroDia'],
        'fechaCreacion' => $row['fechaCreacion'],
        'clienteLlevar' => $row['clienteLlevar'],
        'status' => $row['status'],
        'horaAbierto' => $row['horaAbierto'],
        'horaCerrado' => $row['horaCerrado'],
        'horaEnvio' => $row['horaEnvio'],
        'usuario' => $row['usuario']
      ];

      // Obtener cantidad de productos y total
      $queryDetalles = "SELECT COUNT(*) as cantidadProductos, SUM(cantidad * precio) as total 
                        FROM pedido_detalle WHERE idPedido = ?";
      $stmtDetalles = $conn->prepare($queryDetalles);
      $stmtDetalles->bind_param("i", $row['idPedido']);
      $stmtDetalles->execute();
      $resultDetalles = $stmtDetalles->get_result();
      $detallesData = $resultDetalles->fetch_assoc();

      $pedidoItem['cantidadProductos'] = (int) $detallesData['cantidadProductos'];
      $pedidoItem['total'] = (float) $detallesData['total'];

      $pedidos[] = $pedidoItem;
    }

    sendResponse(true, "Pedidos para llevar obtenidos correctamente", $pedidos);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener pedidos para llevar: " . $e->getMessage());
  }
}

// Endpoint para finalizar un pedido para llevar
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'finalizarPedidoLlevar') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;

  if (empty($idPedido)) {
    sendResponse(false, "Debe proporcionar el ID del pedido para llevar");
  }

  try {
    // Verificar que sea un pedido para llevar
    $queryVerify = "SELECT idPedido FROM pedido WHERE idPedido = ? AND tipo = 'llevar' LIMIT 1";
    $stmtVerify = $conn->prepare($queryVerify);
    $stmtVerify->bind_param("i", $idPedido);
    $stmtVerify->execute();
    $resultVerify = $stmtVerify->get_result();

    if ($resultVerify->num_rows === 0) {
      sendResponse(false, "Pedido para llevar no encontrado");
    }

    // Cambiar estado del pedido a 'finalizado'
    $queryUpdate = "UPDATE pedido SET 
                    status = 'finalizado', 
                    horaCerrado = NOW() 
                    WHERE idPedido = ?";
    $stmtUpdate = $conn->prepare($queryUpdate);
    $stmtUpdate->bind_param("i", $idPedido);
    $stmtUpdate->execute();

    sendResponse(true, "Pedido para llevar finalizado correctamente");
  } catch (Exception $e) {
    sendResponse(false, "Error al finalizar pedido para llevar: " . $e->getMessage());
  }
}









/*------------------------------------------------------*/






/**
 * Pedidos.php - Manejo de operaciones de pedidos para la API de Mi App Windows
 * Este archivo procesa operaciones relacionadas con los pedidos
 */

// Si se accede directamente, denegar acceso
//if (!defined('BASEPATH')) exit('No direct script access allowed');

// Manejar solicitud de cambio de mesa
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'cambiarMesaPedido') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;
  $idMesaOriginal = isset($datapost['idMesaOriginal']) ? (int) $datapost['idMesaOriginal'] : 0;
  $idMesaDestino = isset($datapost['idMesaDestino']) ? (int) $datapost['idMesaDestino'] : 0;
  $numeroMesaDestino = isset($datapost['numeroMesaDestino']) ? (int) $datapost['numeroMesaDestino'] : 0;
  $nombreMesaDestino = isset($datapost['nombreMesaDestino']) ? $datapost['nombreMesaDestino'] : '';

  // Validaciones
  if (empty($idPedido)) {
    sendResponse(false, "Debe proporcionar el ID del pedido");
  }

  if (empty($idMesaOriginal) || empty($idMesaDestino)) {
    sendResponse(false, "Debe proporcionar los IDs de las mesas de origen y destino");
  }

  try {
    // Iniciar transacción
    $conn->begin_transaction();

    // 1. Verificar si la mesa destino está disponible
    $queryVerificarDestino = "SELECT status FROM mesa WHERE idMesa = ? LIMIT 1";
    $stmtVerificarDestino = $conn->prepare($queryVerificarDestino);
    $stmtVerificarDestino->bind_param("i", $idMesaDestino);
    $stmtVerificarDestino->execute();
    $resultVerificarDestino = $stmtVerificarDestino->get_result();

    if ($resultVerificarDestino->num_rows === 0) {
      $conn->rollback();
      sendResponse(false, "La mesa de destino no existe");
    }

    $mesaDestinoData = $resultVerificarDestino->fetch_assoc();

    if ($mesaDestinoData['status'] === 'ocupada') {
      $conn->rollback();
      sendResponse(false, "La mesa de destino ya está ocupada");
    }

    // 2. Actualizar la relación pedido_mesa
    $queryActualizarPedidoMesa = "UPDATE pedido_mesa SET 
                                  idMesa = ?, 
                                  numeroMesa = ?, 
                                  nombreMesa = ? 
                                  WHERE idPedido = ?";
    $stmtActualizarPedidoMesa = $conn->prepare($queryActualizarPedidoMesa);
    $stmtActualizarPedidoMesa->bind_param("iisi", $idMesaDestino, $numeroMesaDestino, $nombreMesaDestino, $idPedido);
    $stmtActualizarPedidoMesa->execute();

    // 3. Actualizar el estado de la mesa original (liberarla)
    $queryLiberarMesaOriginal = "UPDATE mesa SET 
                                status = '', 
                                pedidoActivo = '' 
                                WHERE idMesa = ?";
    $stmtLiberarMesaOriginal = $conn->prepare($queryLiberarMesaOriginal);
    $stmtLiberarMesaOriginal->bind_param("i", $idMesaOriginal);
    $stmtLiberarMesaOriginal->execute();

    // 4. Actualizar el estado de la mesa destino (ocuparla)
    $queryOcuparMesaDestino = "UPDATE mesa SET 
                              status = 'ocupada', 
                              pedidoActivo = ? 
                              WHERE idMesa = ?";
    $stmtOcuparMesaDestino = $conn->prepare($queryOcuparMesaDestino);

    // Obtener el número de pedido
    $queryNumeroPedido = "SELECT numero FROM pedido WHERE idPedido = ? LIMIT 1";
    $stmtNumeroPedido = $conn->prepare($queryNumeroPedido);
    $stmtNumeroPedido->bind_param("i", $idPedido);
    $stmtNumeroPedido->execute();
    $resultNumeroPedido = $stmtNumeroPedido->get_result();
    $pedidoData = $resultNumeroPedido->fetch_assoc();
    $numeroPedido = $pedidoData['numero'];

    $stmtOcuparMesaDestino->bind_param("si", $numeroPedido, $idMesaDestino);
    $stmtOcuparMesaDestino->execute();

    // Confirmar cambios
    $conn->commit();

    // 5. Devolver respuesta exitosa
    sendResponse(true, "Mesa cambiada exitosamente", [
      'idPedido' => $idPedido,
      'idMesaAnterior' => $idMesaOriginal,
      'idMesaNueva' => $idMesaDestino,
      'numeroMesaNueva' => $numeroMesaDestino,
      'nombreMesaNueva' => $nombreMesaDestino
    ]);
  } catch (Exception $e) {
    // Revertir cambios en caso de error
    $conn->rollback();
    sendResponse(false, "Error al cambiar la mesa: " . $e->getMessage());
  }
}

// Verificar si existe un pedido en una mesa específica
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'verificarPedidoEnMesa') {
  $idMesa = isset($datapost['idMesa']) ? (int) $datapost['idMesa'] : 0;

  if (empty($idMesa)) {
    sendResponse(false, "Debe proporcionar el ID de la mesa");
  }

  try {
    // Verificar si hay un pedido activo en la mesa
    $query = "SELECT p.* 
              FROM pedido p 
              JOIN pedido_mesa pm ON p.idPedido = pm.idPedido 
              WHERE pm.idMesa = ? 
              AND p.status IN ('abierto', 'pendiente') 
              LIMIT 1";

    $stmt = $conn->prepare($query);
    $stmt->bind_param("i", $idMesa);
    $stmt->execute();
    $result = $stmt->get_result();

    if ($result->num_rows === 0) {
      // No hay pedido activo
      sendResponse(true, "No hay pedido activo en esta mesa", [
        'existePedido' => false,
        'pedido' => null
      ]);
    } else {
      // Hay un pedido activo
      $pedido = $result->fetch_assoc();

      sendResponse(true, "Pedido encontrado", [
        'existePedido' => true,
        'pedido' => $pedido
      ]);
    }
  } catch (Exception $e) {
    sendResponse(false, "Error al verificar pedido en mesa: " . $e->getMessage());
  }
}

// Crear un nuevo pedido
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'crearPedido') {
  $datosPedido = isset($datapost['datosPedido']) ? $datapost['datosPedido'] : null;

  if (empty($datosPedido)) {
    sendResponse(false, "Debe proporcionar los datos del pedido");
  }

  try {
    // Iniciar transacción para asegurar la integridad de los datos
    $conn->begin_transaction();

    // Extraer datos necesarios
    $idMesa = isset($datosPedido['idMesa']) ? (int)$datosPedido['idMesa'] : 0;
    $numeroMesa = isset($datosPedido['numeroMesa']) ? (int)$datosPedido['numeroMesa'] : 0;
    $nombreMesa = isset($datosPedido['nombreMesa']) ? $datosPedido['nombreMesa'] : "Mesa $numeroMesa";
    $numeroPersonas = isset($datosPedido['numeroPersonas']) ? (int)$datosPedido['numeroPersonas'] : 1;
    $mesero = isset($datosPedido['nombreMesero']) ? $datosPedido['nombreMesero'] : '';
    $idMesero = isset($datosPedido['idMesero']) ? (int)$datosPedido['idMesero'] : 0;
    $usuario = isset($datosPedido['usuario']) ? $datosPedido['usuario'] : 'admin';

    // Obtener fecha del último corte para la función inserta_pedido
    $queryFechaCorte = "SELECT CONCAT(fecha, ' ', hora) as fechaCorte FROM corte ORDER BY idCorte DESC LIMIT 1";
    $resultFechaCorte = $conn->query($queryFechaCorte);

    if ($resultFechaCorte && $resultFechaCorte->num_rows > 0) {
      $rowFechaCorte = $resultFechaCorte->fetch_assoc();
      $fechaUltimoCorte = $rowFechaCorte['fechaCorte'];
    } else {
      // Si no hay cortes previos, usar una fecha predeterminada
      $fechaUltimoCorte = '2000-01-01 00:00:00';
    }

    $fechaUltimoCorte = date('Ymd H:i:s', strtotime($fechaUltimoCorte));

    // Preparar parámetros para la función inserta_pedido
    $tPedido = '1'; // 1 = mesa, 2 = domicilio, 3 = llevar
    $hoy = date('Y-m-d');
    $hora = date('H:i:s');
    $status = 'abierto';

    // Llamar a la función inserta_pedido
    $query = "SELECT inserta_pedido(?, ?, ?, ?, ?, ?) as numeroPedido";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("ssssss", $fechaUltimoCorte, $tPedido, $hoy, $hora, $status, $usuario);
    $stmt->execute();
    $result = $stmt->get_result();

    if (!$result) {
      throw new Exception("Error al ejecutar la función inserta_pedido: " . $conn->error);
    }

    $row = $result->fetch_assoc();

    if (!$row || !isset($row['numeroPedido'])) {
      throw new Exception("Error al obtener el número de pedido");
    }

    $numeroPedido = $row['numeroPedido'];

    // Obtener el ID del pedido recién creado
    $queryPedidoID = "SELECT idPedido FROM pedido WHERE numero = ? ORDER BY idPedido DESC LIMIT 1";
    $stmtPedidoID = $conn->prepare($queryPedidoID);
    $stmtPedidoID->bind_param("i", $numeroPedido);
    $stmtPedidoID->execute();
    $resultPedidoID = $stmtPedidoID->get_result();

    if (!$resultPedidoID || $resultPedidoID->num_rows === 0) {
      throw new Exception("No se pudo encontrar el pedido recién creado");
    }

    $rowPedidoID = $resultPedidoID->fetch_assoc();
    $idPedido = $rowPedidoID['idPedido'];

    // Actualizar información adicional del pedido
    $queryUpdate = "UPDATE pedido SET 
                    numeroPersonas = ?, 
                    mesero = ? 
                    WHERE idPedido = ?";
    $stmtUpdate = $conn->prepare($queryUpdate);
    $stmtUpdate->bind_param("isi", $numeroPersonas, $mesero, $idPedido);

    if (!$stmtUpdate->execute()) {
      throw new Exception("Error al actualizar información del pedido: " . $stmtUpdate->error);
    }

    // Asociar la mesa con el pedido si es un pedido a mesa
    if ($idMesa > 0) {
      $queryMesa = "INSERT INTO pedido_mesa (
                      idPedido, 
                      pedido, 
                      idMesa, 
                      numeroMesa, 
                      nombreMesa, 
                      enviadoServicio
                    ) VALUES (
                      ?, ?, ?, ?, ?, 0
                    )";

      $stmtMesa = $conn->prepare($queryMesa);
      $stmtMesa->bind_param(
        "iiiss",
        $idPedido,
        $numeroPedido,
        $idMesa,
        $numeroMesa,
        $nombreMesa
      );

      if (!$stmtMesa->execute()) {
        throw new Exception("Error al asociar mesa con pedido: " . $stmtMesa->error);
      }

      // Actualizar el estado de la mesa a 'ocupada'
      $queryUpdateMesa = "UPDATE mesa SET status = 'ocupada', pedidoActivo = ? WHERE idMesa = ?";
      $stmtUpdateMesa = $conn->prepare($queryUpdateMesa);
      $pedidoActivoStr = (string)$numeroPedido;
      $stmtUpdateMesa->bind_param("si", $pedidoActivoStr, $idMesa);

      if (!$stmtUpdateMesa->execute()) {
        throw new Exception("Error al actualizar estado de la mesa: " . $stmtUpdateMesa->error);
      }
    }

    // Insertar detalles del pedido si hay productos
    if (isset($datosPedido['detalles']) && is_array($datosPedido['detalles']) && count($datosPedido['detalles']) > 0) {
      foreach ($datosPedido['detalles'] as $detalle) {
        $queryDetalle = "INSERT INTO pedido_detalle (
                          idPedido, 
                          pedido, 
                          idPlatillo, 
                          nombrePlatillo, 
                          cantidad, 
                          precio, 
                          idCategoria, 
                          nombreCategoria, 
                          costo, 
                          status, 
                          enviadoServicio
                        ) VALUES (
                          ?, ?, ?, ?, ?, ?, ?, ?, ?, 'activo', 0
                        )";

        $stmtDetalle = $conn->prepare($queryDetalle);
        $idCategoria = isset($detalle['idCategoria']) ? (int)$detalle['idCategoria'] : 0;
        $nombreCategoria = isset($detalle['nombreCategoria']) ? $detalle['nombreCategoria'] : '';
        $costo = isset($detalle['costo']) ? (float)$detalle['costo'] : 0;

        $stmtDetalle->bind_param(
          "iiisddiss",
          $idPedido,
          $numeroPedido,
          $detalle['idPlatillo'],
          $detalle['nombrePlatillo'],
          $detalle['cantidad'],
          $detalle['precio'],
          $idCategoria,
          $nombreCategoria,
          $costo
        );

        if (!$stmtDetalle->execute()) {
          throw new Exception("Error al insertar detalle del pedido: " . $stmtDetalle->error);
        }

        $idPedidoDetalle = $conn->insert_id;

        // Insertar observaciones si existen
        if (isset($detalle['observaciones']) && is_array($detalle['observaciones']) && count($detalle['observaciones']) > 0) {
          foreach ($detalle['observaciones'] as $observacion) {
            $queryInsertObs = "INSERT INTO observacion_detalle (
                                idPedidoDetalle,
                                idPedido,
                                txt,
                                idPlatillo,
                                numeroPlatillo,
                                status,
                                enviadoServicio
                              ) VALUES (
                                ?, ?, ?, ?, ?, 'activo', 0
                              )";

            $stmtInsertObs = $conn->prepare($queryInsertObs);
            $numeroPlatillo = $numeroPedido; // Usar el número de pedido como número de platillo

            $stmtInsertObs->bind_param(
              "iisii",
              $idPedidoDetalle,
              $idPedido,
              $observacion,
              $detalle['idPlatillo'],
              $numeroPlatillo
            );

            if (!$stmtInsertObs->execute()) {
              throw new Exception("Error al insertar observación: " . $stmtInsertObs->error);
            }
          }
        }
      }
    }

    // Confirmar la transacción
    $conn->commit();

    // Obtener los datos completos del pedido creado
    $queryPedido = "SELECT * FROM pedido WHERE idPedido = ?";
    $stmtPedido = $conn->prepare($queryPedido);
    $stmtPedido->bind_param("i", $idPedido);
    $stmtPedido->execute();
    $resultPedido = $stmtPedido->get_result();
    $pedidoCreado = $resultPedido->fetch_assoc();

    sendResponse(true, "Pedido creado correctamente", $pedidoCreado);
  } catch (Exception $e) {
    // Revertir cambios en caso de error
    $conn->rollback();
    sendResponse(false, "Error al crear el pedido: " . $e->getMessage());
  }
}

// Eliminar producto de un pedido
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'eliminarProductoPedido') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;
  $idPedidoDetalle = isset($datapost['idPedidoDetalle']) ? (int) $datapost['idPedidoDetalle'] : 0;

  if (empty($idPedido) || empty($idPedidoDetalle)) {
    sendResponse(false, "Debe proporcionar el ID del pedido y el ID del detalle");
  }

  try {
    // Verificar que el detalle pertenezca al pedido
    $queryVerify = "SELECT idPedidoDetalle FROM pedido_detalle WHERE idPedido = ? AND idPedidoDetalle = ? LIMIT 1";
    $stmtVerify = $conn->prepare($queryVerify);
    $stmtVerify->bind_param("ii", $idPedido, $idPedidoDetalle);
    $stmtVerify->execute();
    $resultVerify = $stmtVerify->get_result();

    if ($resultVerify->num_rows === 0) {
      sendResponse(false, "El producto no pertenece al pedido especificado");
    }

    // Eliminar observaciones asociadas
    $queryDeleteObs = "DELETE FROM observacion_detalle WHERE idPedidoDetalle = ?";
    $stmtDeleteObs = $conn->prepare($queryDeleteObs);
    $stmtDeleteObs->bind_param("i", $idPedidoDetalle);
    $stmtDeleteObs->execute();

    // Eliminar el detalle
    $queryDelete = "DELETE FROM pedido_detalle WHERE idPedidoDetalle = ?";
    $stmtDelete = $conn->prepare($queryDelete);
    $stmtDelete->bind_param("i", $idPedidoDetalle);
    $stmtDelete->execute();

    sendResponse(true, "Producto eliminado correctamente");
  } catch (Exception $e) {
    sendResponse(false, "Error al eliminar producto del pedido: " . $e->getMessage());
  }
}

// Actualizar cantidad de un producto
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'actualizarCantidadProducto') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;
  $idPedidoDetalle = isset($datapost['idPedidoDetalle']) ? (int) $datapost['idPedidoDetalle'] : 0;
  $cantidad = isset($datapost['cantidad']) ? (float) $datapost['cantidad'] : 0;

  if (empty($idPedido) || empty($idPedidoDetalle) || $cantidad <= 0) {
    sendResponse(false, "Datos inválidos para actualizar cantidad");
  }

  try {
    // Verificar que el detalle pertenezca al pedido
    $queryVerify = "SELECT idPedidoDetalle FROM pedido_detalle WHERE idPedido = ? AND idPedidoDetalle = ? LIMIT 1";
    $stmtVerify = $conn->prepare($queryVerify);
    $stmtVerify->bind_param("ii", $idPedido, $idPedidoDetalle);
    $stmtVerify->execute();
    $resultVerify = $stmtVerify->get_result();

    if ($resultVerify->num_rows === 0) {
      sendResponse(false, "El producto no pertenece al pedido especificado");
    }

    // Actualizar la cantidad
    $queryUpdate = "UPDATE pedido_detalle SET cantidad = ? WHERE idPedidoDetalle = ?";
    $stmtUpdate = $conn->prepare($queryUpdate);
    $stmtUpdate->bind_param("di", $cantidad, $idPedidoDetalle);
    $stmtUpdate->execute();

    sendResponse(true, "Cantidad actualizada correctamente");
  } catch (Exception $e) {
    sendResponse(false, "Error al actualizar cantidad: " . $e->getMessage());
  }
}

// Finalizar pedido (cambiar estado a 'finalizado')
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'finalizarPedido') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;

  if (empty($idPedido)) {
    sendResponse(false, "Debe proporcionar el ID del pedido");
  }

  try {
    // Cambiar estado del pedido a 'finalizado'
    $queryUpdate = "UPDATE pedido SET status = 'finalizado', horaCerrado = NOW() WHERE idPedido = ?";
    $stmtUpdate = $conn->prepare($queryUpdate);
    $stmtUpdate->bind_param("i", $idPedido);
    $stmtUpdate->execute();

    // Verificar si es un pedido de mesa
    $queryMesa = "SELECT idMesa FROM pedido_mesa WHERE idPedido = ? LIMIT 1";
    $stmtMesa = $conn->prepare($queryMesa);
    $stmtMesa->bind_param("i", $idPedido);
    $stmtMesa->execute();
    $resultMesa = $stmtMesa->get_result();

    if ($resultMesa->num_rows > 0) {
      $mesaData = $resultMesa->fetch_assoc();
      $idMesa = $mesaData['idMesa'];

      // Liberar la mesa
      $queryUpdateMesa = "UPDATE mesa SET status = 'abierto', pedidoActivo = '' WHERE idMesa = ?";
      $stmtUpdateMesa = $conn->prepare($queryUpdateMesa);
      $stmtUpdateMesa->bind_param("i", $idMesa);
      $stmtUpdateMesa->execute();
    }

    sendResponse(true, "Pedido finalizado correctamente");
  } catch (Exception $e) {
    sendResponse(false, "Error al finalizar pedido: " . $e->getMessage());
  }
}

// Cancelar pedido
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'cancelarPedido') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;
  $motivo = isset($datapost['motivo']) ? $datapost['motivo'] : 'Sin especificar';

  if (empty($idPedido)) {
    sendResponse(false, "Debe proporcionar el ID del pedido");
  }

  try {
    // Cambiar estado del pedido a 'cancelado'
    $queryUpdate = "UPDATE pedido SET status = 'cancelado', comentarios = ? WHERE idPedido = ?";
    $stmtUpdate = $conn->prepare($queryUpdate);
    $stmtUpdate->bind_param("si", $motivo, $idPedido);
    $stmtUpdate->execute();

    // Verificar si es un pedido de mesa
    $queryMesa = "SELECT idMesa FROM pedido_mesa WHERE idPedido = ? LIMIT 1";
    $stmtMesa = $conn->prepare($queryMesa);
    $stmtMesa->bind_param("i", $idPedido);
    $stmtMesa->execute();
    $resultMesa = $stmtMesa->get_result();

    if ($resultMesa->num_rows > 0) {
      $mesaData = $resultMesa->fetch_assoc();
      $idMesa = $mesaData['idMesa'];

      // Liberar la mesa
      $queryUpdateMesa = "UPDATE mesa SET status = 'abierto', pedidoActivo = '' WHERE idMesa = ?";
      $stmtUpdateMesa = $conn->prepare($queryUpdateMesa);
      $stmtUpdateMesa->bind_param("i", $idMesa);
      $stmtUpdateMesa->execute();
    }

    sendResponse(true, "Pedido cancelado correctamente");
  } catch (Exception $e) {
    sendResponse(false, "Error al cancelar pedido: " . $e->getMessage());
  }
}

// Agregar observaciones a un producto del pedido
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'agregarObservacionesProducto') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;
  $idPedidoDetalle = isset($datapost['idPedidoDetalle']) ? (int) $datapost['idPedidoDetalle'] : 0;
  $observaciones = isset($datapost['observaciones']) ? $datapost['observaciones'] : [];

  if (empty($idPedido) || empty($idPedidoDetalle) || !is_array($observaciones)) {
    sendResponse(false, "Datos inválidos para agregar observaciones");
  }

  try {
    // Verificar que el detalle pertenezca al pedido
    $queryVerify = "SELECT pd.idPedidoDetalle, pd.idPlatillo, p.numero 
                    FROM pedido_detalle pd 
                    JOIN pedido p ON pd.idPedido = p.idPedido 
                    WHERE pd.idPedido = ? AND pd.idPedidoDetalle = ? 
                    LIMIT 1";
    $stmtVerify = $conn->prepare($queryVerify);
    $stmtVerify->bind_param("ii", $idPedido, $idPedidoDetalle);
    $stmtVerify->execute();
    $resultVerify = $stmtVerify->get_result();

    if ($resultVerify->num_rows === 0) {
      sendResponse(false, "El producto no pertenece al pedido especificado");
    }

    $detalleData = $resultVerify->fetch_assoc();
    $idPlatillo = $detalleData['idPlatillo'];
    $numeroPedido = $detalleData['numero'];

    // Eliminar observaciones existentes
    $queryDeleteObs = "DELETE FROM observacion_detalle WHERE idPedidoDetalle = ?";
    $stmtDeleteObs = $conn->prepare($queryDeleteObs);
    $stmtDeleteObs->bind_param("i", $idPedidoDetalle);
    $stmtDeleteObs->execute();

    // Insertar nuevas observaciones
    foreach ($observaciones as $observacion) {
      $queryInsertObs = "INSERT INTO observacion_detalle (
                          idPedidoDetalle, 
                          idPedido, 
                          txt, 
                          idPlatillo, 
                          numeroPlatillo, 
                          status, 
                          enviadoServicio
                        ) VALUES (
                          ?, ?, ?, ?, ?, 'activo', 0
                        )";

      $stmtInsertObs = $conn->prepare($queryInsertObs);
      $stmtInsertObs->bind_param(
        "iisii",
        $idPedidoDetalle,
        $idPedido,
        $observacion,
        $idPlatillo,
        $numeroPedido
      );
      $stmtInsertObs->execute();
    }

    sendResponse(true, "Observaciones agregadas correctamente");
  } catch (Exception $e) {
    sendResponse(false, "Error al agregar observaciones: " . $e->getMessage());
  }
}

// Aplicar promociones a un pedido
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'aplicarPromocionesAPedido') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;
  $promociones = isset($datapost['promociones']) ? $datapost['promociones'] : [];

  if (empty($idPedido) || !is_array($promociones)) {
    sendResponse(false, "Datos inválidos para aplicar promociones");
  }

  try {
    // Verificar que el pedido exista
    $queryVerify = "SELECT idPedido FROM pedido WHERE idPedido = ? LIMIT 1";
    $stmtVerify = $conn->prepare($queryVerify);
    $stmtVerify->bind_param("i", $idPedido);
    $stmtVerify->execute();
    $resultVerify = $stmtVerify->get_result();

    if ($resultVerify->num_rows === 0) {
      sendResponse(false, "El pedido especificado no existe");
    }

    // Eliminar promociones existentes
    $queryDeletePromos = "DELETE FROM pedido_promocion WHERE idPedido = ?";
    $stmtDeletePromos = $conn->prepare($queryDeletePromos);
    $stmtDeletePromos->bind_param("i", $idPedido);
    $stmtDeletePromos->execute();

    // Insertar nuevas promociones
    foreach ($promociones as $promocion) {
      $queryInsertPromo = "INSERT INTO pedido_promocion (
                            idPedido, 
                            idPromocion, 
                            nombrePromocion, 
                            descuento, 
                            enviadoServicio
                          ) VALUES (
                            ?, ?, ?, ?, 0
                          )";

      $stmtInsertPromo = $conn->prepare($queryInsertPromo);
      $idPromocion = $promocion['idPromocion'] ?? 0;
      $nombre = $promocion['nombre'] ?? '';
      $descuento = $promocion['descuento'] ?? 0;

      $stmtInsertPromo->bind_param(
        "iisd",
        $idPedido,
        $idPromocion,
        $nombre,
        $descuento
      );
      $stmtInsertPromo->execute();
    }

    sendResponse(true, "Promociones aplicadas correctamente");
  } catch (Exception $e) {
    sendResponse(false, "Error al aplicar promociones: " . $e->getMessage());
  }
}

// Separar cuenta
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'separarCuenta') {
  $datosSeparacion = isset($datapost['datosSeparacion']) ? $datapost['datosSeparacion'] : null;

  if (empty($datosSeparacion) || empty($datosSeparacion['idPedido']) || empty($datosSeparacion['cuentas'])) {
    sendResponse(false, "Datos insuficientes para separar la cuenta");
  }

  try {
    $idPedido = $datosSeparacion['idPedido'];
    $cuentas = $datosSeparacion['cuentas'];

    // Obtener información del pedido original
    $queryPedido = "SELECT * FROM pedido WHERE idPedido = ? LIMIT 1";
    $stmtPedido = $conn->prepare($queryPedido);
    $stmtPedido->bind_param("i", $idPedido);
    $stmtPedido->execute();
    $resultPedido = $stmtPedido->get_result();

    if ($resultPedido->num_rows === 0) {
      sendResponse(false, "El pedido especificado no existe");
    }

    $pedidoOriginal = $resultPedido->fetch_assoc();

    // Obtener datos de la mesa si es pedido a mesa
    $mesaData = null;
    if ($pedidoOriginal['tipo'] === 'mesa') {
      $queryMesa = "SELECT * FROM pedido_mesa WHERE idPedido = ? LIMIT 1";
      $stmtMesa = $conn->prepare($queryMesa);
      $stmtMesa->bind_param("i", $idPedido);
      $stmtMesa->execute();
      $resultMesa = $stmtMesa->get_result();

      if ($resultMesa->num_rows > 0) {
        $mesaData = $resultMesa->fetch_assoc();
      }
    }

    // Iniciar transacción
    $conn->begin_transaction();

    $subcuentasCreadas = [];

    // Crear subcuentas para cada una de las cuentas separadas
    foreach ($cuentas as $indexCuenta => $cuenta) {
      if (empty($cuenta['productos'])) {
        continue; // Saltar cuentas sin productos
      }

      // Crear clave única para la subcuenta
      $claveCuenta = "SC-" . $pedidoOriginal['numero'] . "-" . ($indexCuenta + 1);

      // Insertar en tabla subcuenta
      $querySubcuenta = "INSERT INTO subcuenta (idPedido, numeroDia, clave, enviadoServicio) 
                          VALUES (?, ?, ?, 0)";
      $stmtSubcuenta = $conn->prepare($querySubcuenta);
      $stmtSubcuenta->bind_param("iis", $idPedido, $pedidoOriginal['numeroDia'], $claveCuenta);
      $stmtSubcuenta->execute();

      $idSubcuenta = $conn->insert_id;

      // Insertar productos en subcuenta_detalle
      foreach ($cuenta['productos'] as $producto) {
        // Verificar que el producto pertenezca al pedido original
        $queryVerifyProducto = "SELECT * FROM pedido_detalle 
                               WHERE idPedido = ? AND idPedidoDetalle = ? LIMIT 1";
        $stmtVerifyProducto = $conn->prepare($queryVerifyProducto);
        $stmtVerifyProducto->bind_param("ii", $idPedido, $producto['idPedidoDetalle']);
        $stmtVerifyProducto->execute();
        $resultVerifyProducto = $stmtVerifyProducto->get_result();

        if ($resultVerifyProducto->num_rows === 0) {
          // Producto no pertenece al pedido original
          continue;
        }

        $productoOriginal = $resultVerifyProducto->fetch_assoc();

        // Insertar en subcuenta_detalle
        $querySubcuentaDetalle = "INSERT INTO subcuenta_detalle (
                                  idPlatillo, 
                                  nombrePlatillo, 
                                  cantidad, 
                                  precio, 
                                  idCategoria, 
                                  nombreCategoria, 
                                  costo,
                                  clave,
                                  idPedido,
                                  numero,
                                  enviadoServicio
                                ) VALUES (
                                  ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0
                                )";

        $cantidadProducto = $producto['cantidad'] ?? $productoOriginal['cantidad'];

        $stmtSubcuentaDetalle = $conn->prepare($querySubcuentaDetalle);
        $stmtSubcuentaDetalle->bind_param(
          "isddissiii",
          $productoOriginal['idPlatillo'],
          $productoOriginal['nombrePlatillo'],
          $cantidadProducto,
          $productoOriginal['precio'],
          $productoOriginal['idCategoria'],
          $productoOriginal['nombreCategoria'],
          $productoOriginal['costo'],
          $claveCuenta,
          $idPedido,
          $pedidoOriginal['numero']
        );
        $stmtSubcuentaDetalle->execute();
      }

      $subcuentasCreadas[] = [
        'idSubcuenta' => $idSubcuenta,
        'clave' => $claveCuenta,
        'total' => $cuenta['total'] ?? 0
      ];
    }

    // Confirmar transacción
    $conn->commit();

    sendResponse(true, "Cuenta separada correctamente", [
      'subcuentas' => $subcuentasCreadas
    ]);
  } catch (Exception $e) {
    // Revertir transacción en caso de error
    $conn->rollback();
    sendResponse(false, "Error al separar cuenta: " . $e->getMessage());
  }
}

// Obtener pedidos activos
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPedidosActivos') {
  $tipoFiltro = isset($datapost['tipoFiltro']) ? $datapost['tipoFiltro'] : '';
  $activeStatusTab = isset($datapost['activeStatusTab']) ? "'" . $datapost['activeStatusTab'] . "'" : "'abierto'";


  if ($activeStatusTab ==  "'todos_ll'" || $activeStatusTab ==  "'todos_ub'" || $activeStatusTab == "'todos_db'"  || $activeStatusTab == "'todos_ra'") {
    $activeStatusTab = "'abierto', 'pendiente'";
  }



  try {
    // Construir la consulta base
    $query = "SELECT p.* FROM pedido p WHERE p.status IN ($activeStatusTab)";
    //echo $query;

    // Añadir filtro por tipo si se especifica
    if (!empty($tipoFiltro) && $tipoFiltro !== 'todos') {
      $query .= " AND p.tipo = ?";
    }

    $query .= " ORDER BY p.idPedido DESC";

    $stmt = $conn->prepare($query);

    // Bind parameters si hay filtro
    if (!empty($tipoFiltro) && $tipoFiltro !== 'todos') {
      $stmt->bind_param("s", $tipoFiltro);
    }

    $stmt->execute();
    $result = $stmt->get_result();

    $pedidos = [];
    while ($row = $result->fetch_assoc()) {
      $pedidoItem = [
        'idPedido' => (int) $row['idPedido'],
        'numero' => (int) $row['numero'],
        'numeroPersonas' => (int) $row['numeroPersonas'],
        'fechaCreacion' => $row['fechaCreacion'],
        'mesero' => $row['mesero'],
        'tipo' => $row['tipo'],
        'horaAbierto' => $row['horaAbierto'],
        'status' => $row['status'],
        'numeroDia' => $row['numeroDia'],
        'clienteLlevar' => $row['clienteLlevar'],
        'horaCerrado' => $row['horaCerrado'],
        'horaEnvio' => $row['horaEnvio'],


      ];

      // Si es pedido a mesa, obtener información de la mesa
      if ($row['tipo'] === 'mesa') {
        $queryMesa = "SELECT * FROM pedido_mesa WHERE idPedido = ? LIMIT 1";
        $stmtMesa = $conn->prepare($queryMesa);
        $stmtMesa->bind_param("i", $row['idPedido']);
        $stmtMesa->execute();
        $resultMesa = $stmtMesa->get_result();

        if ($resultMesa->num_rows > 0) {
          $mesaData = $resultMesa->fetch_assoc();
          $pedidoItem['mesa'] = [
            'idMesa' => (int) $mesaData['idMesa'],
            'numeroMesa' => (int) $mesaData['numeroMesa'],
            'nombreMesa' => $mesaData['nombreMesa']
          ];
        }
      }

      // Obtener cantidad de productos en el pedido
      $queryDetalles = "SELECT COUNT(*) as cantidadProductos, SUM(cantidad * precio) as total FROM pedido_detalle WHERE idPedido = ?";
      $stmtDetalles = $conn->prepare($queryDetalles);
      $stmtDetalles->bind_param("i", $row['idPedido']);
      $stmtDetalles->execute();
      $resultDetalles = $stmtDetalles->get_result();
      $detallesData = $resultDetalles->fetch_assoc();

      $pedidoItem['cantidadProductos'] = (int) $detallesData['cantidadProductos'];
      $pedidoItem['total'] = (float) $detallesData['total'];

      $pedidos[] = $pedidoItem;
    }

    sendResponse(true, "Pedidos activos obtenidos correctamente", $pedidos);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener pedidos activos: " . $e->getMessage());
  }
}

// Obtener promociones activas
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPromocionesActivas') {
  try {
    $fechaActual = date('Y-m-d');
    $horaActual = date('H:i:s');
    $diaSemana = date('N'); // 1 (lunes) a 7 (domingo)

    // Consultar promociones activas en la fecha y hora actual
    $query = "SELECT p.*, GROUP_CONCAT(pd.idPlatillo) as aplicaProductos 
              FROM promocion p 
              LEFT JOIN promocion_detalle pd ON p.idPromocion = pd.idPromocion 
              LEFT JOIN promocion_dia pd2 ON p.idPromocion = pd2.idPromocion 
              WHERE p.activar = '1' 
              AND p.fechaInicio <= ? 
              AND p.fechaFin >= ? 
              AND p.horaInicio <= ? 
              AND p.horaFin >= ? 
              AND (pd2.dia IS NULL OR pd2.dia = ?) 
              GROUP BY p.idPromocion";

    $stmt = $conn->prepare($query);
    $stmt->bind_param("ssssi", $fechaActual, $fechaActual, $horaActual, $horaActual, $diaSemana);
    $stmt->execute();
    $result = $stmt->get_result();

    $promociones = [];
    while ($row = $result->fetch_assoc()) {
      // Convertir aplicaProductos de string a array
      $aplicaProductos = [];
      if (!empty($row['aplicaProductos'])) {
        $aplicaProductos = array_map('intval', explode(',', $row['aplicaProductos']));
      }

      $promociones[] = [
        'idPromocion' => (int) $row['idPromocion'],
        'nombre' => $row['nombre'],
        'tipo' => $row['tipo'],
        'cantidad1' => $row['cantidad1'] ?? '',
        'cantidad2' => $row['cantidad2'] ?? '',
        'descuento' => $row['descuento'] ?? 0,
        'fechaInicio' => $row['fechaInicio'],
        'fechaFin' => $row['fechaFin'],
        'horaInicio' => $row['horaInicio'],
        'horaFin' => $row['horaFin'],
        'activa' => true,
        'aplicaProductos' => $aplicaProductos,
        'aplicaLlevar' => $row['llevar'] == 1,
        'aplicaMesa' => $row['mesa'] == 1,
        'aplicaDomicilio' => $row['domicilio'] == 1,
        'platillo1' => (int) $row['platillo1'],
        'platillo2' => (int) $row['platillo2']
      ];
    }

    sendResponse(true, "Promociones activas obtenidas correctamente", $promociones);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener promociones activas: " . $e->getMessage());
  }
}

// Obtener platillos por categoría
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPlatillosPorCategoria') {
  $idCategoria = isset($datapost['idCategoria']) ? (int) $datapost['idCategoria'] : 0;

  if (empty($idCategoria)) {
    sendResponse(false, "Debe proporcionar el ID de la categoría");
  }

  try {
    // Consultar platillos de la categoría
    $query = "SELECT * FROM platillo WHERE idCategoria = ? ORDER BY nombre";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("i", $idCategoria);
    $stmt->execute();
    $result = $stmt->get_result();

    $platillos = [];
    while ($row = $result->fetch_assoc()) {
      $platillos[] = [
        'idProducto' => (int) $row['idPlatillo'],
        'nombre' => $row['nombre'],
        'precio' => (float) $row['precio'],
        'costo' => (float) $row['costo'],
        'idCategoria' => (int) $row['idCategoria'],
        'codigo' => $row['codigo'] ?? '',
        'imagen' => $row['imagen'],
        'disponible' => true // Por defecto asumimos que está disponible
      ];
    }

    sendResponse(true, "Platillos obtenidos correctamente", $platillos);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener platillos: " . $e->getMessage());
  }
}

// Si no se reconoce el tipo de solicitud
// No enviar respuesta aquí, ya que este archivo se incluye en api.php 
// y puede haber otras rutas por procesar
// Obtener un pedido específico
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPedido') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;

  if (empty($idPedido)) {
    sendResponse(false, "Debe proporcionar el ID del pedido");
  }

  try {
    // Consultar datos del pedido
    $queryPedido = "SELECT * FROM pedido WHERE idPedido = ? LIMIT 1";
    $stmtPedido = $conn->prepare($queryPedido);
    $stmtPedido->bind_param("i", $idPedido);
    $stmtPedido->execute();
    $resultPedido = $stmtPedido->get_result();

    if ($resultPedido->num_rows === 0) {
      sendResponse(false, "Pedido no encontrado");
    }

    $pedidoData = $resultPedido->fetch_assoc();

    // Obtener detalles del pedido
    $queryDetalles = "SELECT * FROM pedido_detalle WHERE idPedido = ?";
    $stmtDetalles = $conn->prepare($queryDetalles);
    $stmtDetalles->bind_param("i", $idPedido);
    $stmtDetalles->execute();
    $resultDetalles = $stmtDetalles->get_result();

    $detalles = [];
    while ($detalle = $resultDetalles->fetch_assoc()) {
      // Obtener observaciones si existen
      $queryObservaciones = "SELECT * FROM observacion_detalle WHERE idPedidoDetalle = ?";
      $stmtObservaciones = $conn->prepare($queryObservaciones);
      $stmtObservaciones->bind_param("i", $detalle['idPedidoDetalle']);
      $stmtObservaciones->execute();
      $resultObservaciones = $stmtObservaciones->get_result();

      $observaciones = [];
      while ($obs = $resultObservaciones->fetch_assoc()) {
        $observaciones[] = $obs['txt'];
      }

      $detalles[] = [
        'idPedidoDetalle' => (int) $detalle['idPedidoDetalle'],
        'idPlatillo' => (int) $detalle['idPlatillo'],
        'nombrePlatillo' => $detalle['nombrePlatillo'],
        'cantidad' => (float) $detalle['cantidad'],
        'precio' => (float) $detalle['precio'],
        'idCategoria' => (int) $detalle['idCategoria'],
        'nombreCategoria' => $detalle['nombreCategoria'],
        'costo' => (float) $detalle['costo'],
        'status' => $detalle['status'],
        'observaciones' => $observaciones
      ];
    }

    // Obtener promociones aplicadas al pedido
    /*$queryPromociones = "SELECT * FROM pedido_promocion WHERE idPedido = ?";
    $stmtPromociones = $conn->prepare($queryPromociones);
    $stmtPromociones->bind_param("s", $idPedido);
    $stmtPromociones->execute();
    $resultPromociones = $stmtPromociones->get_result();

    $promociones = [];
    while ($promo = $resultPromociones->fetch_assoc()) {
      $promociones[] = [
        'idPromocion' => (int) $promo['idPromocion'],
        'nombre' => $promo['nombrePromocion'],
        'descuento' => (float) $promo['descuento']
      ];
    }*/

    // Si es pedido a mesa, obtener información de la mesa
    $mesaInfo = null;
    if ($pedidoData['tipo'] === 'mesa') {
      $queryMesa = "SELECT * FROM pedido_mesa WHERE idPedido = ? LIMIT 1";
      $stmtMesa = $conn->prepare($queryMesa);
      $stmtMesa->bind_param("i", $idPedido);
      $stmtMesa->execute();
      $resultMesa = $stmtMesa->get_result();

      if ($resultMesa->num_rows > 0) {
        $mesaData = $resultMesa->fetch_assoc();
        $mesaInfo = [
          'idMesa' => (int) $mesaData['idMesa'],
          'numeroMesa' => (int) $mesaData['numeroMesa'],
          'nombreMesa' => $mesaData['nombreMesa']
        ];
      }
    }

    // Obtener información del mesero
    $meseroInfo = null;
    if (!empty($pedidoData['mesero'])) {
      $queryMesero = "SELECT idMesero, nombre, numeroMesero FROM mesero WHERE nombre = ? LIMIT 1";
      $stmtMesero = $conn->prepare($queryMesero);
      $stmtMesero->bind_param("s", $pedidoData['mesero']);
      $stmtMesero->execute();
      $resultMesero = $stmtMesero->get_result();

      if ($resultMesero->num_rows > 0) {
        $meseroData = $resultMesero->fetch_assoc();
        $meseroInfo = [
          'idMesero' => (int) $meseroData['idMesero'],
          'nombre' => $meseroData['nombre'],
          'numeroMesero' => (int) $meseroData['numeroMesero']
        ];
      }
    }

    // Convertir a tipos correctos
    $pedidoProcessed = [
      'idPedido' => (int) $pedidoData['idPedido'],
      'numero' => (int) $pedidoData['numero'],
      'numeroDia' => (int) $pedidoData['numeroDia'],
      'numeroPersonas' => (int) $pedidoData['numeroPersonas'],
      'idCliente' => (int) $pedidoData['idCliente'],
      'fechaCreacion' => $pedidoData['fechaCreacion'],
      'tipo' => $pedidoData['tipo'],
      'status' => $pedidoData['status'],
      'horaAbierto' => $pedidoData['horaAbierto'],
      'horaCerrado' => $pedidoData['horaCerrado'],
      'horaEnvio' => $pedidoData['horaEnvio'],
      'usuario' => $pedidoData['usuario'],
      'liquidado' => $pedidoData['liquidado'],
      'mesa' => $mesaInfo,
      'mesero' => $meseroInfo,
      'detalles' => $detalles,
      //'promociones' => $promociones
    ];

    sendResponse(true, "Pedido encontrado", $pedidoProcessed);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener pedido: " . $e->getMessage());
  }
}

// Actualizar un pedido existente
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'actualizarPedido') {
  $datosPedido = isset($datapost['datosPedido']) ? $datapost['datosPedido'] : null;

  if (empty($datosPedido) || empty($datosPedido['idPedido'])) {
    sendResponse(false, "Debe proporcionar los datos del pedido y su ID");
  }

  try {
    $idPedido = $datosPedido['idPedido'];
    $numeroPersonas = $datosPedido['numeroPersonas'] ?? 1;
    $mesero = $datosPedido['nombreMesero'] ?? '';

    // Actualizar información básica del pedido
    $queryUpdate = "UPDATE pedido SET 
                    numeroPersonas = ?, 
                    mesero = ? 
                    WHERE idPedido = ?";
    $stmtUpdate = $conn->prepare($queryUpdate);
    $stmtUpdate->bind_param("isi", $numeroPersonas, $mesero, $idPedido);
    $stmtUpdate->execute();

    // Si se proporcionan nuevos detalles, actualizarlos
    if (isset($datosPedido['detalles']) && is_array($datosPedido['detalles'])) {
      // Primero, obtener los detalles actuales para compararlos
      $queryDetallesActuales = "SELECT idPedidoDetalle, idPlatillo, cantidad FROM pedido_detalle WHERE idPedido = ?";
      $stmtDetallesActuales = $conn->prepare($queryDetallesActuales);
      $stmtDetallesActuales->bind_param("i", $idPedido);
      $stmtDetallesActuales->execute();
      $resultDetallesActuales = $stmtDetallesActuales->get_result();

      $detallesActuales = [];
      while ($row = $resultDetallesActuales->fetch_assoc()) {
        $detallesActuales[$row['idPedidoDetalle']] = $row;
      }

      // Mapear los nuevos detalles por ID para facilitar la comparación
      $nuevosDetalles = [];
      foreach ($datosPedido['detalles'] as $detalle) {
        if (isset($detalle['idPedidoDetalle'])) {
          $nuevosDetalles[$detalle['idPedidoDetalle']] = $detalle;
        } else {
          // Si no tiene ID, es un nuevo detalle para insertar
          $nuevosDetalles[] = $detalle;
        }
      }

      // Actualizar detalles existentes
      foreach ($detallesActuales as $idPedidoDetalle => $detalleActual) {
        if (isset($nuevosDetalles[$idPedidoDetalle])) {
          // El detalle existe y debe actualizarse
          $nuevoDetalle = $nuevosDetalles[$idPedidoDetalle];

          // Si la cantidad ha cambiado, actualizar
          if ($nuevoDetalle['cantidad'] != $detalleActual['cantidad']) {
            $queryUpdateDetalle = "UPDATE pedido_detalle SET cantidad = ? WHERE idPedidoDetalle = ?";
            $stmtUpdateDetalle = $conn->prepare($queryUpdateDetalle);
            $stmtUpdateDetalle->bind_param("di", $nuevoDetalle['cantidad'], $idPedidoDetalle);
            $stmtUpdateDetalle->execute();
          }

          // Eliminar del array de nuevos detalles para saber que ya se procesó
          unset($nuevosDetalles[$idPedidoDetalle]);
        } else {
          // El detalle ya no existe en el nuevo pedido, se debe eliminar
          $queryDeleteDetalle = "DELETE FROM pedido_detalle WHERE idPedidoDetalle = ?";
          $stmtDeleteDetalle = $conn->prepare($queryDeleteDetalle);
          $stmtDeleteDetalle->bind_param("i", $idPedidoDetalle);
          $stmtDeleteDetalle->execute();

          // También eliminar las observaciones asociadas
          $queryDeleteObs = "DELETE FROM observacion_detalle WHERE idPedidoDetalle = ?";
          $stmtDeleteObs = $conn->prepare($queryDeleteObs);
          $stmtDeleteObs->bind_param("i", $idPedidoDetalle);
          $stmtDeleteObs->execute();
        }
      }

      // Insertar nuevos detalles que no existían
      $numeroPedido = $datosPedido['numero'];
      foreach ($nuevosDetalles as $detalle) {
        // Si no tiene idPedidoDetalle, es un nuevo detalle
        if (!isset($detalle['idPedidoDetalle'])) {
          $queryInsertDetalle = "INSERT INTO pedido_detalle (
                                  idPedido, 
                                  pedido, 
                                  idPlatillo, 
                                  nombrePlatillo, 
                                  cantidad, 
                                  precio, 
                                  idCategoria, 
                                  nombreCategoria, 
                                  costo, 
                                  status, 
                                  enviadoServicio
                               ) VALUES (
                                  ?, ?, ?, ?, ?, ?, ?, ?, ?, 'activo', 0
                               )";

          $stmtInsertDetalle = $conn->prepare($queryInsertDetalle);
          $idCategoria = $detalle['idCategoria'] ?? 0;
          $nombreCategoria = $detalle['nombreCategoria'] ?? '';
          $stmtInsertDetalle->bind_param(
            "iiisddiss",
            $idPedido,
            $numeroPedido,
            $detalle['idPlatillo'],
            $detalle['nombrePlatillo'],
            $detalle['cantidad'],
            $detalle['precio'],
            $idCategoria,
            $nombreCategoria,
            $detalle['costo']
          );
          $stmtInsertDetalle->execute();

          // Obtener el ID del detalle recién insertado
          $idPedidoDetalle = $conn->insert_id;

          // Insertar observaciones si existen
          if (isset($detalle['observaciones']) && is_array($detalle['observaciones']) && count($detalle['observaciones']) > 0) {
            foreach ($detalle['observaciones'] as $observacion) {
              $queryInsertObs = "INSERT INTO observacion_detalle (
                                  idPedidoDetalle, 
                                  idPedido, 
                                  txt, 
                                  idPlatillo, 
                                  numeroPlatillo, 
                                  status, 
                                  enviadoServicio
                                ) VALUES (
                                  ?, ?, ?, ?, 0, 'activo', 0
                                )";

              $stmtInsertObs = $conn->prepare($queryInsertObs);
              $stmtInsertObs->bind_param(
                "iisii",
                $idPedidoDetalle,
                $idPedido,
                $observacion,
                $detalle['idPlatillo'],
                $numeroPedido
              );
              $stmtInsertObs->execute();
            }
          }
        }
      }
    }

    // Actualizar promociones si se proporcionan
    if (isset($datosPedido['promociones']) && is_array($datosPedido['promociones'])) {
      // Eliminar promociones actuales
      $queryDeletePromos = "DELETE FROM pedido_promocion WHERE idPedido = ?";
      $stmtDeletePromos = $conn->prepare($queryDeletePromos);
      $stmtDeletePromos->bind_param("i", $idPedido);
      $stmtDeletePromos->execute();

      // Insertar nuevas promociones
      foreach ($datosPedido['promociones'] as $promocion) {
        $queryInsertPromo = "INSERT INTO pedido_promocion (
                              idPedido, 
                              idPromocion, 
                              nombrePromocion, 
                              descuento, 
                              enviadoServicio
                            ) VALUES (
                              ?, ?, ?, ?, 0
                            )";

        $stmtInsertPromo = $conn->prepare($queryInsertPromo);
        $stmtInsertPromo->bind_param(
          "iisd",
          $idPedido,
          $promocion['idPromocion'],
          $promocion['nombre'],
          $promocion['descuento']
        );
        $stmtInsertPromo->execute();
      }
    }

    // Obtener los datos actualizados del pedido
    $queryPedido = "SELECT * FROM pedido WHERE idPedido = ?";
    $stmtPedido = $conn->prepare($queryPedido);
    $stmtPedido->bind_param("i", $idPedido);
    $stmtPedido->execute();
    $resultPedido = $stmtPedido->get_result();
    $pedidoActualizado = $resultPedido->fetch_assoc();

    sendResponse(true, "Pedido actualizado correctamente", $pedidoActualizado);
  } catch (Exception $e) {
    sendResponse(false, "Error al actualizar el pedido: " . $e->getMessage());
  }
}

// Agregar producto a un pedido
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'agregarProductoPedido') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;
  $producto = isset($datapost['producto']) ? $datapost['producto'] : null;

  if (empty($idPedido) || empty($producto)) {
    sendResponse(false, "Debe proporcionar el ID del pedido y los datos del producto");
  }

  try {
    // Obtener número del pedido
    $queryPedido = "SELECT numero FROM pedido WHERE idPedido = ? LIMIT 1";
    $stmtPedido = $conn->prepare($queryPedido);
    $stmtPedido->bind_param("i", $idPedido);
    $stmtPedido->execute();
    $resultPedido = $stmtPedido->get_result();

    if ($resultPedido->num_rows === 0) {
      sendResponse(false, "Pedido no encontrado");
    }

    $pedidoData = $resultPedido->fetch_assoc();
    $numeroPedido = $pedidoData['numero'];

    // Insertar el producto
    $queryInsert = "INSERT INTO pedido_detalle (
                      idPedido, 
                      pedido, 
                      idPlatillo, 
                      nombrePlatillo, 
                      cantidad, 
                      precio, 
                      idCategoria, 
                      nombreCategoria, 
                      costo, 
                      status, 
                      enviadoServicio
                    ) VALUES (
                      ?, ?, ?, ?, ?, ?, ?, ?, ?, 'activo', 0
                    )";

    $stmtInsert = $conn->prepare($queryInsert);
    $idCategoria = $producto['idCategoria'] ?? 0;
    $nombreCategoria = $producto['nombreCategoria'] ?? '';
    $stmtInsert->bind_param(
      "iiisddiss",
      $idPedido,
      $numeroPedido,
      $producto['idPlatillo'],
      $producto['nombrePlatillo'],
      $producto['cantidad'],
      $producto['precio'],
      $idCategoria,
      $nombreCategoria,
      $producto['costo']
    );
    $stmtInsert->execute();

    $idPedidoDetalle = $conn->insert_id;

    // Insertar observaciones si existen
    if (isset($producto['observaciones']) && is_array($producto['observaciones']) && count($producto['observaciones']) > 0) {
      foreach ($producto['observaciones'] as $observacion) {
        $queryInsertObs = "INSERT INTO observacion_detalle (
                            idPedidoDetalle, 
                            idPedido, 
                            txt, 
                            idPlatillo, 
                            numeroPlatillo, 
                            status, 
                            enviadoServicio
                          ) VALUES (?, ?, ?, ?, 0
                          )";

        $stmtPromocion = $conn->prepare($queryPromocion);
        $stmtPromocion->bind_param(
          "iisd",
          $idPedido,
          $promocion['idPromocion'],
          $promocion['nombre'],
          $promocion['descuento']
        );
        $stmtPromocion->execute();
      }
    }

    // Obtener los datos completos del pedido creado
    $queryPedido = "SELECT * FROM pedido WHERE idPedido = ?";
    $stmtPedido = $conn->prepare($queryPedido);
    $stmtPedido->bind_param("i", $idPedido);
    $stmtPedido->execute();
    $resultPedido = $stmtPedido->get_result();
    $pedidoCreado = $resultPedido->fetch_assoc();

    sendResponse(true, "Pedido creado correctamente", $pedidoCreado);
  } catch (Exception $e) {
    sendResponse(false, "Error al crear el pedido: " . $e->getMessage());
  }
}
