<?php

/**
 * Productos.php - Manejo de operaciones relacionadas con productos y sus ingredientes
 * para la API de Mi App Windows
 */

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

// Procesar solicitud para obtener productos por categoría
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPorCategoria') {
  $idCategoria = isset($datapost['idCategoria']) ? (int) $datapost['idCategoria'] : 0;

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

  try {
    // Consultar productos de la categoría
    $query = "SELECT idPlatillo as idProducto, nombre, precio, codigo, 
              imprimirCocina, existencia, utilizaDisponibles, disponibles,impresora
              FROM platillo 
              WHERE idCategoria = ? 
              AND (existencia IS NULL OR existencia > 0 OR utilizaDisponibles = 1)
              ORDER BY nombre";

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

    $productos = [];
    while ($row = $result->fetch_assoc()) {
      // Convertir campos numéricos a números
      $row['idProducto'] = (int) $row['idProducto'];
      $row['precio'] = (float) $row['precio'];

      if (isset($row['existencia'])) {
        $row['existencia'] = (int) $row['existencia'];
      }

      if (isset($row['disponibles'])) {
        $row['disponibles'] = (int) $row['disponibles'];
      }

      $productos[] = $row;
    }

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

// Procesar solicitud para obtener ingredientes de un producto específico
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getIngredientesProducto') {
  $idProducto = isset($datapost['idProducto']) ? (int) $datapost['idProducto'] : 0;

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

  try {
    // Consultar ingredientes del producto
    $query = "SELECT i.idIngrediente, i.NOMBRE as nombre, pi.cantidad 
              FROM ingrediente i
              JOIN platillo_ingrediente pi ON i.idIngrediente = pi.idIngrediente
              WHERE pi.idPlatillo = ? and i.desechable = 0 
              ORDER BY i.NOMBRE";

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

    $ingredientes = [];
    while ($row = $result->fetch_assoc()) {
      // Convertir campos numéricos a números
      $row['idIngrediente'] = (int) $row['idIngrediente'];
      $row['cantidad'] = (float) $row['cantidad'];

      $ingredientes[] = $row;
    }

    sendResponse(true, "Ingredientes obtenidos correctamente", $ingredientes);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener ingredientes: " . $e->getMessage());
  }
}
if ($datapost['tipo'] === 'buscarPlatillosPorIngrediente') {
  $termino = $datapost['termino'] ?? '';
  $excluir = (isset($datapost['excluir']) && $datapost['excluir'] === true);

  if (empty($termino)) {
    echo json_encode([
      'success' => false,
      'message' => 'Término de búsqueda vacío',
      'data' => []
    ]);
    exit;
  }

  $platillos = buscarPlatillosPorIngrediente($termino, $excluir);

  // Asegurarse de que los tipos de datos sean correctos
  foreach ($platillos as &$platillo) {
    // Convertir precio y otros campos numéricos a float
    if (isset($platillo['precio'])) {
      $platillo['precio'] = (float)$platillo['precio'];
    }

    // Otros campos numéricos que puedan necesitar conversión
    if (isset($platillo['existencia'])) {
      $platillo['existencia'] = (int)$platillo['existencia'];
    }

    // Añadir idProducto si no existe para compatibilidad con frontend
    if (!isset($platillo['idProducto']) && isset($platillo['idPlatillo'])) {
      $platillo['idProducto'] = $platillo['idPlatillo'];
    }
  }

  echo json_encode([
    'success' => true,
    'data' => $platillos,
    'count' => count($platillos)
  ]);
  exit;
}

/**
 * Función para buscar platillos por ingrediente
 * @param string $termino - Ingrediente a buscar
 * @param bool $excluir - Buscar platillos sin este ingrediente
 * @return array - Lista de platillos que cumplen el criterio
 */
function buscarPlatillosPorIngrediente($termino, $excluir = false)
{
  global $conn;

  // Sanear el término de búsqueda
  $termino = '%' . trim($termino) . '%';

  // Consulta SQL diferente según si queremos platillos con o sin el ingrediente
  if ($excluir) {
    // Buscar platillos que NO contienen el ingrediente
    $sql = "SELECT p.* FROM platillo p 
              WHERE p.idPlatillo NOT IN (
                  SELECT DISTINCT pi.idPlatillo FROM platillo_ingrediente pi 
                  JOIN ingrediente i ON pi.idIngrediente = i.idIngrediente 
                  WHERE i.NOMBRE LIKE ?
              )
              AND (p.existencia IS NULL OR p.existencia > 0)";
  } else {
    // Buscar platillos que contienen el ingrediente
    $sql = "SELECT p.*, i.NOMBRE as ingrediente_nombre FROM platillo p 
              JOIN platillo_ingrediente pi ON p.idPlatillo = pi.idPlatillo 
              JOIN ingrediente i ON pi.idIngrediente = i.idIngrediente 
              WHERE i.NOMBRE LIKE ?
              AND (p.existencia IS NULL OR p.existencia > 0)
              GROUP BY p.idPlatillo";
  }

  $stmt = $conn->prepare($sql);
  $stmt->bind_param('s', $termino);
  $stmt->execute();
  $result = $stmt->get_result();

  $platillos = [];
  while ($row = $result->fetch_assoc()) {
    // Agregar información del ingrediente si está disponible
    if (isset($row['ingrediente_nombre'])) {
      $row['ingrediente_encontrado'] = $row['ingrediente_nombre'];
    }
    $platillos[] = $row;
  }

  return $platillos;
}


// 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