<?php

/**
 * Categorias.php - Manejo de operaciones de categorías y platillos
 * Este archivo procesa operaciones relacionadas con categorías y platillos/productos
 */

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

// Obtener todas las categorías
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getCategorias') {
  try {
    // Consultar todas las categorías
    $query = "SELECT * FROM categoria ORDER BY nombre";
    $result = $conn->query($query);

    $categorias = [];
    while ($row = $result->fetch_assoc()) {
      $categorias[] = [
        'idCategoria' => (int) $row['idCategoria'],
        'nombre' => $row['nombre'],
        'titleSize' => (int) $row['titleSize'],
        'imagen' => $row['imagen'],
        'posicionX' => (int) $row['posicionX'],
        'posicionY' => (int) $row['posicionY'],
        'width' => (int) $row['width'],
        'height' => (int) $row['height'],
        'posicionTitle' => $row['posicionTitle'],
        'colorFondo' => $row['colorFondo'],
        'colorTitulo' => $row['colorTitulo'],
        'colorLetra' => $row['colorLetra'],
        'impresora' => $row['impresora']
      ];
    }

    sendResponse(true, "Categorías obtenidas correctamente", $categorias);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener categorías: " . $e->getMessage());
  }
}

// Obtener una categoría específica
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getCategoria') {
  $idCategoria = isset($datapost['idCategoria']) ? (int) $datapost['idCategoria'] : 0;

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

  try {
    // Consultar la categoría específica
    $query = "SELECT * FROM categoria WHERE idCategoria = ? LIMIT 1";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("i", $idCategoria);
    $stmt->execute();
    $result = $stmt->get_result();

    if ($result->num_rows === 0) {
      sendResponse(false, "Categoría no encontrada");
    }

    $categoria = $result->fetch_assoc();
    $categoriaData = [
      'idCategoria' => (int) $categoria['idCategoria'],
      'nombre' => $categoria['nombre'],
      'titleSize' => (int) $categoria['titleSize'],
      'imagen' => $categoria['imagen'],
      'posicionX' => (int) $categoria['posicionX'],
      'posicionY' => (int) $categoria['posicionY'],
      'width' => (int) $categoria['width'],
      'height' => (int) $categoria['height'],
      'posicionTitle' => $categoria['posicionTitle'],
      'colorFondo' => $categoria['colorFondo'],
      'colorTitulo' => $categoria['colorTitulo'],
      'colorLetra' => $categoria['colorLetra'],
      'impresora' => $categoria['impresora']
    ];

    sendResponse(true, "Categoría obtenida correctamente", $categoriaData);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener categoría: " . $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());
  }
}

// Obtener un platillo específico
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPlatillo') {
  $idPlatillo = isset($datapost['idPlatillo']) ? (int) $datapost['idPlatillo'] : 0;

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

  try {
    // Consultar el platillo específico
    $query = "SELECT * FROM platillo WHERE idPlatillo = ? LIMIT 1";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("i", $idPlatillo);
    $stmt->execute();
    $result = $stmt->get_result();

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

    $platillo = $result->fetch_assoc();
    $platilloData = [
      'idProducto' => (int) $platillo['idPlatillo'],
      'nombre' => $platillo['nombre'],
      'precio' => (float) $platillo['precio'],
      'costo' => (float) $platillo['costo'],
      'idCategoria' => (int) $platillo['idCategoria'],
      'codigo' => $platillo['codigo'] ?? '',
      'imagen' => $platillo['imagen'],
      'title' => $platillo['title'],
      'titleSize' => (int) $platillo['titleSize'],
      'precioSize' => (int) $platillo['precioSize'],
      'posicionX' => (int) $platillo['posicionX'],
      'posicionY' => (int) $platillo['posicionY'],
      'width' => (int) $platillo['width'],
      'height' => (int) $platillo['height'],
      'posicionTitle' => $platillo['posicionTitle'],
      'colorFondo' => $platillo['colorFondo'],
      'colorTitulo' => $platillo['colorTitulo'],
      'colorLetra' => $platillo['colorLetra'],
      'imprimirCocina' => $platillo['imprimirCocina'],
      'disponible' => true // Por defecto asumimos que está disponible
    ];

    sendResponse(true, "Platillo obtenido correctamente", $platilloData);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener platillo: " . $e->getMessage());
  }
}

// Buscar platillos por nombre
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'buscarPlatillos') {
  $termino = isset($datapost['termino']) ? $datapost['termino'] : '';

  if (empty($termino)) {
    sendResponse(false, "Debe proporcionar un término de búsqueda");
  }

  try {
    // Buscar platillos que contengan el término en su nombre
    $terminoBusqueda = '%' . $termino . '%';
    $query = "SELECT * FROM platillo WHERE nombre LIKE ? ORDER BY nombre";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("s", $terminoBusqueda);
    $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 encontrados", $platillos);
  } catch (Exception $e) {
    sendResponse(false, "Error al buscar platillos: " . $e->getMessage());
  }
}

// Verificar disponibilidad de un platillo
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'verificarDisponibilidadPlatillo') {
  $idPlatillo = isset($datapost['idPlatillo']) ? (int) $datapost['idPlatillo'] : 0;
  $cantidad = isset($datapost['cantidad']) ? (int) $datapost['cantidad'] : 1;

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

  try {
    // Verificar existencia del platillo
    $query = "SELECT utilizaDisponibles, disponibles FROM platillo WHERE idPlatillo = ? LIMIT 1";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("i", $idPlatillo);
    $stmt->execute();
    $result = $stmt->get_result();

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

    $platillo = $result->fetch_assoc();

    // Verificar si el platillo usa disponibles
    if ($platillo['utilizaDisponibles'] == 1) {
      // Verificar si hay suficientes disponibles
      $disponibles = (int) $platillo['disponibles'];
      $disponible = ($disponibles >= $cantidad);

      sendResponse(true, "Disponibilidad verificada", [
        'disponible' => $disponible,
        'cantidad' => $disponibles,
        'mensaje' => $disponible ? "Producto disponible" : "No hay suficientes unidades disponibles"
      ]);
    } else {
      // Si no usa disponibles, siempre está disponible
      sendResponse(true, "Disponibilidad verificada", [
        'disponible' => true,
        'cantidad' => 999, // Un número alto para indicar disponibilidad ilimitada
        'mensaje' => "Producto disponible"
      ]);
    }
  } catch (Exception $e) {
    sendResponse(false, "Error al verificar disponibilidad: " . $e->getMessage());
  }
}

// No enviar respuesta aquí, ya que este archivo se incluye en api.php
// y puede haber otras rutas por procesar