<?php

/**
 * Impresoras.php - Endpoint específico para obtener impresoras necesarias
 * 
 * Este archivo maneja operaciones relacionadas con las impresoras del sistema
 * e implementa un endpoint optimizado para el semáforo de impresoras
 */

// Manejar solicitud para obtener todas las impresoras necesarias 
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getImpresorasNecesarias') {
  try {
    // Conexión a la base de datos ya establecida en api.php

    // 1. Obtener impresoras asignadas a categorías
    $query = "SELECT DISTINCT impresora FROM platillo WHERE impresora IS NOT NULL AND impresora != ''";
    $result = $conn->query($query);

    $impresorasCategoria = [];
    if ($result && $result->num_rows > 0) {
      while ($row = $result->fetch_assoc()) {
        $impresorasCategoria[] = $row['impresora'];
      }
    }

    // 2. Obtener impresoras asignadas a platillos directamente
    $query = "SELECT DISTINCT impresora FROM platillo WHERE impresora IS NOT NULL AND impresora != ''";
    $result = $conn->query($query);

    $impresorasPlatillo = [];
    if ($result && $result->num_rows > 0) {
      while ($row = $result->fetch_assoc()) {
        $impresorasPlatillo[] = $row['impresora'];
      }
    }

    // 3. Obtener impresora principal de configuración del sistema
    $query = "SELECT impresoraCocina, impresoraTicket FROM system LIMIT 1";
    $result = $conn->query($query);

    $impresorasPrincipales = [];
    if ($result && $result->num_rows > 0) {
      $configSys = $result->fetch_assoc();
      if (!empty($configSys['impresoraCocina'])) {
        $impresorasPrincipales[] = $configSys['impresoraCocina'];
      }
      if (!empty($configSys['impresoraTicket'])) {
        $impresorasPrincipales[] = $configSys['impresoraTicket'];
      }
    }

    // Combinar todas las impresoras y eliminar duplicados
    $todasImpresoras = array_unique(array_merge($impresorasCategoria, $impresorasPlatillo, $impresorasPrincipales));

    // Formatear la respuesta con información adicional
    $impresorasFormateadas = [];
    foreach ($todasImpresoras as $impresora) {
      $impresorasFormateadas[] = [
        'nombre' => $impresora,
        'alias' => $impresora,
        'enCategorias' => in_array($impresora, $impresorasCategoria),
        'enPlatillos' => in_array($impresora, $impresorasPlatillo),
        'esPrincipal' => in_array($impresora, $impresorasPrincipales)
      ];
    }

    sendResponse(true, "Impresoras necesarias obtenidas correctamente", $impresorasFormateadas);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener impresoras necesarias: " . $e->getMessage());
  }
}

// Obtener platillos de una categoría específica junto con sus impresoras
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getPlatillosConImpresora') {
  $idCategoria = isset($datapost['idCategoria']) ? (int) $datapost['idCategoria'] : 0;

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

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

    $platillos = [];
    while ($row = $result->fetch_assoc()) {
      // Si el platillo no tiene impresora asignada, intentar obtener la de su categoría
      if (empty($row['impresora'])) {
        $queryCategoria = "SELECT impresora FROM categoria WHERE idCategoria = ? LIMIT 1";
        $stmtCategoria = $conn->prepare($queryCategoria);
        $stmtCategoria->bind_param("i", $idCategoria);
        $stmtCategoria->execute();
        $resultCategoria = $stmtCategoria->get_result();

        if ($resultCategoria->num_rows > 0) {
          $categoriaData = $resultCategoria->fetch_assoc();
          $row['impresora'] = $categoriaData['impresora'];
        }
      }

      $platillos[] = $row;
    }

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

// Verificar estado de una impresora específica
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'verificarEstadoImpresora') {
  $nombreImpresora = isset($datapost['nombreImpresora']) ? $datapost['nombreImpresora'] : '';

  if (empty($nombreImpresora)) {
    sendResponse(false, "Debe proporcionar el nombre de la impresora");
  }

  try {
    // Esta parte dependería de cómo verificas las impresoras en tu sistema
    // Aquí solo devolvemos un estado simulado
    $estadoSimulado = [
      'disponible' => true,
      'online' => true,
      'mensaje' => "Impresora disponible (simulación)",
      'detalles' => null
    ];

    sendResponse(true, "Estado de impresora verificado", $estadoSimulado);
  } catch (Exception $e) {
    sendResponse(false, "Error al verificar estado de impresora: " . $e->getMessage());
  }
}

// Si no se reconoce el tipo de solicitud
// No enviar respuesta aquí, ya que este archivo se incluirá en api.php
// y podría haber otras rutas por procesar