<?php
// ENDPOINTS PARA PEDIDOS DELIBOT

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

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

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

    // Extraer datos necesarios
    $numeroDelibot = isset($datosPedido['numeroDelibot']) ? $datosPedido['numeroDelibot'] : 'DEL-00000';
    $usuario = isset($datapost['usuario']) ? $datapost['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 = '6'; // 1 = mesa, 2 = domicilio, 3 = llevar, 4 = uber, 5 = rappi, 6 = delibot
    $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 = 'delibot'
                    WHERE idPedido = ?";
    $stmtUpdate = $conn->prepare($queryUpdate);
    $stmtUpdate->bind_param("si", $numeroDelibot, $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 Delibot creado correctamente", $pedidoCreado);
  } catch (Exception $e) {
    // Revertir cambios en caso de error
    $conn->rollback();
    sendResponse(false, "Error al crear el pedido Delibot: " . $e->getMessage());
  }
}

// Endpoint para actualizar un pedido Delibot
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'actualizarPedidoDelibot') {
  $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'];
    $numeroDelibot = isset($datosPedido['numeroDelibot']) ? $datosPedido['numeroDelibot'] : 'DEL-00000';
    $repartidor = isset($datosPedido['repartidor']) ? $datosPedido['repartidor'] : '';

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

    // Si se proporcionan nuevos detalles, actualizarlos
    if (isset($datosPedido['detalles']) && is_array($datosPedido['detalles'])) {
      foreach ($datosPedido['detalles'] as $detalle) {
        // Insertar el detalle como un nuevo producto
        $queryInsert = "INSERT INTO pedido_detalle (
                          idPedido, 
                          pedido, 
                          idPlatillo, 
                          nombrePlatillo, 
                          cantidad, 
                          precio, 
                          idCategoria, 
                          nombreCategoria, 
                          costo, 
                          status, 
                          enviadoServicio
                        ) VALUES (
                          ?, ?, ?, ?, ?, ?, ?, ?, ?, 'activo', 0
                        )";

        $stmtInsert = $conn->prepare($queryInsert);
        $numeroPedido = $datosPedido['numero'] ?? 0;
        $idCategoria = $detalle['idCategoria'] ?? 0;
        $nombreCategoria = $detalle['nombreCategoria'] ?? '';
        $costo = $detalle['costo'] ?? 0;

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

        // Manejar observaciones si existen
        if (isset($detalle['observaciones']) && is_array($detalle['observaciones'])) {
          $idPedidoDetalle = $conn->insert_id;
          foreach ($detalle['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,
              $detalle['idPlatillo'],
              $numeroPedido
            );
            $stmtInsertObs->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 Delibot actualizado correctamente", $pedidoActualizado);
  } catch (Exception $e) {
    sendResponse(false, "Error al actualizar el pedido Delibot: " . $e->getMessage());
  }
}

// Endpoint para agregar un producto a un pedido Delibot
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'agregarProductoPedidoDelibot') {
  $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 = 'delibot' 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 Delibot 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 (
                            ?, ?, ?, ?, ?, 'activo', 0
                          )";

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

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

// Endpoint para obtener un pedido Delibot por ID
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPedidoDelibot') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;

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

  try {
    // Consultar datos del pedido
    $queryPedido = "SELECT * FROM pedido WHERE idPedido = ? AND tipo = 'delibot' 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 Delibot 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'],
      'numeroDelibot' => $pedidoData['clienteLlevar'],
      'repartidor' => $pedidoData['repartidor'] ?? '',
      'detalles' => $detalles
    ];

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

// Endpoint para obtener todos los pedidos Delibot según su estado
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPedidosDelibot') {
  $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;
      case 'todos_db':
        $statusFilter = "'abierto', 'pendiente'";
        break;
      default:
        $statusFilter = "'abierto'";
    }

    // Construir la consulta
    $query = "SELECT p.* FROM pedido p 
              WHERE p.tipo = 'delibot' 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'],
        'numeroDelibot' => $row['clienteLlevar'],
        'repartidor' => $row['repartidor'] ?? '',
        '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 Delibot obtenidos correctamente", $pedidos);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener pedidos Delibot: " . $e->getMessage());
  }
}

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

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

  try {
    // Verificar que sea un pedido Delibot
    $queryVerify = "SELECT idPedido FROM pedido WHERE idPedido = ? AND tipo = 'delibot' 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 Delibot 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 Delibot finalizado correctamente");
  } catch (Exception $e) {
    sendResponse(false, "Error al finalizar pedido Delibot: " . $e->getMessage());
  }
}

// Endpoint para cambiar el estado de un pedido Delibot
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'cambiarEstadoPedidoDelibot') {
  $idPedido = isset($datapost['idPedido']) ? (int) $datapost['idPedido'] : 0;
  $nuevoEstado = isset($datapost['nuevoEstado']) ? $datapost['nuevoEstado'] : '';

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

  try {
    // Verificar que sea un pedido Delibot
    $queryVerify = "SELECT idPedido FROM pedido WHERE idPedido = ? AND tipo = 'delibot' 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 Delibot no encontrado");
    }

    // Cambiar estado del pedido
    $queryUpdate = "UPDATE pedido SET 
                    status = ? ";

    // Si el estado es 'finalizado' o 'pagado', actualizar horaCerrado
    if ($nuevoEstado === 'finalizado' || $nuevoEstado === 'pagado') {
      $queryUpdate .= ", horaCerrado = NOW() ";
    }

    $queryUpdate .= "WHERE idPedido = ?";

    $stmtUpdate = $conn->prepare($queryUpdate);
    $stmtUpdate->bind_param("si", $nuevoEstado, $idPedido);
    $stmtUpdate->execute();

    sendResponse(true, "Estado del pedido Delibot actualizado correctamente");
  } catch (Exception $e) {
    sendResponse(false, "Error al cambiar estado del pedido Delibot: " . $e->getMessage());
  }
}
