<?php
// ================== HEADERS / CORS ==================
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Access-Control-Max-Age: 86400");
header("Content-Type: application/json; charset=UTF-8");
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

// ================== SOLO JSON, NUNCA HTML ==================
ini_set('display_errors', 0);
ini_set('html_errors', 0);
@ini_set('xdebug.default_enable', 0);
@ini_set('xdebug.mode', 'off');
error_reporting(E_ALL);

// Helper: salida JSON segura
function json_out(int $status, array $payload) {
  if (!headers_sent()) http_response_code($status);
  echo json_encode($payload, JSON_UNESCAPED_UNICODE);
  exit;
}

// ================== DB CONFIG ==================
require_once(__DIR__ . '/../../config.php'); // Debe definir $mysqli

// Helper: ejecutar statement SIN excepciones (captura errno)
function safe_execute(mysqli_stmt $stmt): array {
  // Guardar modo actual de reportes
  $old_flags = mysqli_report(MYSQLI_REPORT_OFF); // desactiva excepciones/warnings de mysqli
  // Ejecutar con supresión de warnings (no salen a la salida)
  $ok = @$stmt->execute();
  $errno = $stmt->errno ?: $stmt->get_result()?->errno; // por compatibilidad
  $error = $stmt->error;
  // Restaurar modo estricto por si otros lados dependen de él
  mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
  return [$ok, $errno, $error];
}

// ================== INPUT ==================
$input = json_decode(file_get_contents('php://input'), true);
if (!is_array($input)) {
  json_out(400, ['success' => false, 'message' => 'JSON inválido.']);
}

$id          = isset($input['id']) ? (int)$input['id'] : null;
$slug_tienda = trim($input['slug_tienda'] ?? '');
$zona_id     = isset($input['zona_id']) ? (int)$input['zona_id'] : 0;
$numero      = isset($input['numero']) ? (int)$input['numero'] : 0;
$capacidad   = isset($input['capacidad']) ? (int)$input['capacidad'] : 0;
$activo      = isset($input['activo']) ? (int)$input['activo'] : 1;

if ($slug_tienda === '' || $zona_id <= 0 || $numero <= 0) {
  json_out(400, ['success' => false, 'message' => 'Faltan slug_tienda, zona_id o número de mesa.']);
}

// ================== UPDATE ==================
if ($id && $id > 0) {
  // Validación lógica temprana
  $check = $mysqli->prepare("SELECT id FROM pos_mesas WHERE slug_tienda=? AND zona_id=? AND numero=? AND id!=?");
  $check->bind_param("siii", $slug_tienda, $zona_id, $numero, $id);
  [$okC] = safe_execute($check);
  if (!$okC) {
    $check->close();
    json_out(500, ['success' => false, 'message' => 'Error validando duplicados.']);
  }
  $check->store_result();
  if ($check->num_rows > 0) {
    $check->close();
    $mysqli->close();
    json_out(409, ['success' => false, 'message' => 'Ya existe una mesa con ese número en esa zona para esta tienda.']);
  }
  $check->close();

  // UPDATE definitivo sin excepciones
  $stmt = $mysqli->prepare("UPDATE pos_mesas SET zona_id=?, numero=?, capacidad=?, activo=? WHERE id=? AND slug_tienda=?");
  $stmt->bind_param("iiiisi", $zona_id, $numero, $capacidad, $activo, $id, $slug_tienda);
  [$okU, $errnoU, $errorU] = safe_execute($stmt);
  $stmt->close();

  if (!$okU) {
    if ($errnoU == 1062) {
      json_out(409, ['success' => false, 'message' => 'Ya existe una mesa con ese número en esa zona para esta tienda.']);
    }
    json_out(500, ['success' => false, 'message' => 'Error al actualizar la mesa.']);
  }

  $mysqli->close();
  json_out(200, ['success' => true, 'message' => 'Mesa actualizada', 'id' => $id]);
}

// ================== INSERT ==================
// Validación lógica temprana
$check = $mysqli->prepare("SELECT id FROM pos_mesas WHERE slug_tienda=? AND zona_id=? AND numero=?");
$check->bind_param("sii", $slug_tienda, $zona_id, $numero);
[$okC] = safe_execute($check);
if (!$okC) {
  $check->close();
  json_out(500, ['success' => false, 'message' => 'Error validando duplicados.']);
}
$check->store_result();
if ($check->num_rows > 0) {
  $check->close();
  $mysqli->close();
  json_out(409, ['success' => false, 'message' => 'Ya existe una mesa con ese número en esa zona para esta tienda.']);
}
$check->close();

// INSERT definitivo sin excepciones
$stmt = $mysqli->prepare("INSERT INTO pos_mesas (slug_tienda, zona_id, numero, capacidad, activo) VALUES (?,?,?,?,?)");
$stmt->bind_param("siiii", $slug_tienda, $zona_id, $numero, $capacidad, $activo);
[$okI, $errnoI, $errorI] = safe_execute($stmt);

if ($okI) {
  $newId = $mysqli->insert_id;
  $stmt->close();
  $mysqli->close();
  json_out(201, ['success' => true, 'message' => 'Mesa creada', 'id' => $newId]);
} else {
  $stmt->close();
  $mysqli->close();
  if ($errnoI == 1062) {
    json_out(409, [
      'success' => false,
      'message' => 'Ya existe una mesa con ese número en esa zona para esta tienda.',
      'hint'    => 'Cambia el número de mesa o selecciona otra zona.'
    ]);
  }
  json_out(500, ['success' => false, 'message' => 'Error al guardar la mesa.']);
}
