<?php

/**
 * Mesa.php - Manejo de operaciones de mesas para la API de Mi App Windows
 * Este archivo maneja las operaciones CRUD para la tabla mesa
 */

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

// Procesar solicitud para obtener todas las mesas
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getMesas') {
  try {
    // Conexión a la base de datos ya establecida en api.php
    $query = "SELECT * FROM mesa ORDER BY numero";
    $result = $conn->query($query);

    $mesas = [];
    while ($row = $result->fetch_assoc()) {
      // Convertir campos numéricos a enteros
      $row['idMesa'] = (int) $row['idMesa'];
      $row['numero'] = (int) $row['numero'];
      $row['posicionX'] = (int) $row['posicionX'];
      $row['posicionY'] = (int) $row['posicionY'];
      $row['width'] = (int) $row['width'];
      $row['height'] = (int) $row['height'];

      $mesas[] = $row;
    }

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

// Procesar solicitud para obtener una mesa específica
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getMesa') {
  $idMesa = isset($datapost['idMesa']) ? (int) $datapost['idMesa'] : 0;

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

  try {
    $query = "SELECT * FROM mesa WHERE idMesa = ? LIMIT 1";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("i", $idMesa);
    $stmt->execute();
    $result = $stmt->get_result();

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

    $mesa = $result->fetch_assoc();
    // Convertir campos numéricos a enteros
    $mesa['idMesa'] = (int) $mesa['idMesa'];
    $mesa['numero'] = (int) $mesa['numero'];
    $mesa['posicionX'] = (int) $mesa['posicionX'];
    $mesa['posicionY'] = (int) $mesa['posicionY'];
    $mesa['width'] = (int) $mesa['width'];
    $mesa['height'] = (int) $mesa['height'];
    $mesa['existePedido'] =  $mesa['pedidoActivo'];



    sendResponse(true, "Mesa obtenida correctamente", $mesa);
  } catch (Exception $e) {
    sendResponse(false, "Error al obtener la mesa: " . $e->getMessage());
  }
}

// Procesar solicitud para actualizar el estado de una mesa
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'updateMesaStatus') {
  $idMesa = isset($datapost['idMesa']) ? (int) $datapost['idMesa'] : 0;
  $status = isset($datapost['status']) ? $datapost['status'] : '';

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

  if (empty($status) || !in_array($status, ['abierta', 'ocupada', 'pendiente'])) {
    sendResponse(false, "Estado de mesa no válido");
  }

  try {
    $query = "UPDATE mesa SET status = ? WHERE idMesa = ?";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("si", $status, $idMesa);
    $stmt->execute();

    if ($stmt->affected_rows === 0) {
      sendResponse(false, "No se pudo actualizar el estado de la mesa o el estado es el mismo");
    }

    sendResponse(true, "Estado de mesa actualizado correctamente");
  } catch (Exception $e) {
    sendResponse(false, "Error al actualizar el estado de la mesa: " . $e->getMessage());
  }
}

// Procesar solicitud para verificar disponibilidad de una mesa
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'checkMesaAvailability') {
  $idMesa = isset($datapost['idMesa']) ? (int) $datapost['idMesa'] : 0;

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

  try {
    $query = "SELECT status FROM mesa WHERE idMesa = ? LIMIT 1";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("i", $idMesa);
    $stmt->execute();
    $result = $stmt->get_result();

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

    $mesa = $result->fetch_assoc();
    $isAvailable = ($mesa['status'] === 'abierta');

    sendResponse(true, "Disponibilidad de mesa verificada", [
      'available' => $isAvailable,
      'status' => $mesa['status']
    ]);
  } catch (Exception $e) {
    sendResponse(false, "Error al verificar disponibilidad de mesa: " . $e->getMessage());
  }
}

// Procesar solicitud para obtener mesas según su estado
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getMesasPorTipo') {
  $status = isset($datapost['status']) ? $datapost['status'] : null;

  try {
    if ($status) {
      $query = "SELECT * FROM mesa WHERE status = ? ORDER BY numero";
      $stmt = $conn->prepare($query);
      $stmt->bind_param("s", $status);
      $stmt->execute();
      $result = $stmt->get_result();
    } else {
      $query = "SELECT * FROM mesa ORDER BY numero";
      $result = $conn->query($query);
    }

    $mesas = [];
    while ($row = $result->fetch_assoc()) {
      // Convertir campos numéricos a enteros
      $row['idMesa'] = (int) $row['idMesa'];
      $row['numero'] = (int) $row['numero'];
      $row['posicionX'] = (int) $row['posicionX'];
      $row['posicionY'] = (int) $row['posicionY'];
      $row['width'] = (int) $row['width'];
      $row['height'] = (int) $row['height'];

      $mesas[] = $row;
    }

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

// Si no se reconoce el tipo de solicitud
sendResponse(false, "Tipo de solicitud de mesa no reconocida");
