<?php
// api.php - COMPLETO CON ELIMINAR PEDIDO
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

require_once __DIR__ . '/config.php';

// Función para enviar respuestas JSON
function sendJsonResponse($data) {
    echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit;
}

$conn = getDB();
if (!$conn) {
    sendJsonResponse(['error' => 'Error de conexión a la base de datos']);
}

$action = $_GET['action'] ?? '';

// Manejar solicitudes OPTIONS para CORS
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

switch ($action) {
    case 'getDisponibilidad':
        getDisponibilidad($conn);
        break;
    case 'getPedidos':
        getPedidos($conn);
        break;
    case 'nuevoPedido':
        nuevoPedido($conn);
        break;
    case 'reiniciarDia':
        reiniciarDia($conn);
        break;
    case 'limpiarPedidosKitchen':
        limpiarPedidosKitchen($conn);
        break;
    case 'getEstadisticas':
        getEstadisticas($conn);
        break;
    case 'verificarConexion':
        sendJsonResponse(['success' => true, 'mensaje' => 'Conexión exitosa']);
        break;
    case 'actualizarEstadoPedido':
        actualizarEstadoPedido($conn);
        break;
    case 'getResumenEstados':
        getResumenEstados($conn);
        break;
    case 'eliminarPedido':
        eliminarPedido($conn);
        break;
    // ── Check-in ──────────────────────────────────────────────
    case 'getCheckins':
        getCheckins($conn);
        break;
    case 'registrarCheckin':
        registrarCheckin($conn);
        break;
    case 'registrarCheckout':
        registrarCheckout($conn);
        break;
    case 'getHabitacionesActivas':
        getHabitacionesActivas($conn);
        break;
    case 'verificarHabitacion':
        verificarHabitacion($conn);
        break;
    case 'resetearDesayunoDiario':
        resetearDesayunoDiario($conn);
        break;
    case 'resetearHabitacion':
        resetearHabitacion($conn);
        break;
    case 'eliminarCheckin':
        eliminarCheckin($conn);
        break;
    case 'getInformeRango':
        getInformeRango($conn);
        break;
    default:
        sendJsonResponse(['error' => 'Acción no válida: ' . $action]);
}

// ============================================
// FUNCIONES
// ============================================

function getDisponibilidad($conn) {
    $fecha = $_GET['fecha'] ?? date('Y-m-d');
    
    $sql = "SELECT horario, reservados, max_capacidad as max FROM disponibilidad WHERE fecha = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("s", $fecha);
    $stmt->execute();
    $result = $stmt->get_result();
    
    $disponibilidad = [];
    while ($row = $result->fetch_assoc()) {
        $disponibilidad[$row['horario']] = [
            'reservados' => (int)$row['reservados'],
            'max' => (int)$row['max']
        ];
    }
    
    sendJsonResponse($disponibilidad);
}

function getPedidos($conn) {
    $fecha = $_GET['fecha'] ?? date('Y-m-d');
    
    $sql = "SELECT * FROM pedidos WHERE fecha_desayuno = ? ORDER BY horario, habitacion";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("s", $fecha);
    $stmt->execute();
    $result = $stmt->get_result();
    
    $pedidos = [];
    while ($row = $result->fetch_assoc()) {
        $pedidos[] = [
            'id' => (int)$row['id'],
            'habitacion' => (int)$row['habitacion'],
            'nombre_pasajero' => $row['nombre_pasajero'] ?? '',
            'horario' => $row['horario'],
            'desayunos' => json_decode($row['desayunos'], true),
            'variaciones' => json_decode($row['variaciones'], true),
            'nota' => $row['nota'],
            'total_pasajeros' => (int)$row['total_pasajeros'],
            'idioma' => $row['idioma'],
            'fecha_pedido' => $row['fecha_pedido'],
            'fecha_desayuno' => $row['fecha_desayuno'],
            'estado_cocina' => $row['estado_cocina'] ?? 'nuevo',
            'fecha_estado' => $row['fecha_estado'] ?? null
        ];
    }
    
    sendJsonResponse($pedidos);
}

function nuevoPedido($conn) {
    $data = json_decode(file_get_contents('php://input'), true);
    
    if (!$data) {
        sendJsonResponse(['success' => false, 'error' => 'Datos no válidos']);
        return;
    }
    
    $habitacion = (int)($data['habitacion'] ?? 0);
    $nombre_pasajero = $data['nombre_pasajero'] ?? '';
    $horario = $data['horario'] ?? '';

    // ── Verificar check-in activo ─────────────────────────────────────
    $sqlCI = "SELECT id, num_pasajeros, desayuno_pedido FROM checkin WHERE habitacion = ? AND activo = 1 LIMIT 1";
    $stmtCI = $conn->prepare($sqlCI);
    $stmtCI->bind_param("i", $habitacion);
    $stmtCI->execute();
    $rowCI = $stmtCI->get_result()->fetch_assoc();

    if (!$rowCI) {
        sendJsonResponse(['success' => false, 'error' => 'checkin_requerido',
            'mensaje' => 'La habitación ' . $habitacion . ' no tiene check-in activo. Consulte en recepción.']);
        return;
    }

    if ((int)$rowCI['desayuno_pedido'] === 1) {
        sendJsonResponse(['success' => false, 'error' => 'pedido_duplicado',
            'mensaje' => 'Ya existe un pedido de desayuno para la habitación ' . $habitacion . ' hoy.']);
        return;
    }

    $totalPasajeros = (int)($data['totalPasajeros'] ?? 0);
    if ($totalPasajeros > (int)$rowCI['num_pasajeros']) {
        sendJsonResponse(['success' => false, 'error' => 'excede_pasajeros',
            'mensaje' => 'El pedido supera el número de pasajeros del check-in (' . $rowCI['num_pasajeros'] . ').']);
        return;
    }

    $desayunos = json_encode($data['desayunos'] ?? [], JSON_UNESCAPED_UNICODE);
    $variaciones = json_encode($data['variaciones'] ?? [], JSON_UNESCAPED_UNICODE);
    $nota = $data['nota'] ?? '';
    $totalPasajeros = (int)($data['totalPasajeros'] ?? 0);
    $idioma = $data['lang'] ?? 'es';
    $fecha_desayuno = date('Y-m-d');
    
    // Validar disponibilidad
    $sql = "SELECT reservados, max_capacidad FROM disponibilidad WHERE fecha = ? AND horario = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("ss", $fecha_desayuno, $horario);
    $stmt->execute();
    $result = $stmt->get_result();
    $disp = $result->fetch_assoc();
    
    if (!$disp) {
        sendJsonResponse(['success' => false, 'error' => 'Horario no disponible']);
        return;
    }
    
    if ($disp['reservados'] + $totalPasajeros > $disp['max_capacidad']) {
        sendJsonResponse(['success' => false, 'error' => 'No hay suficiente capacidad']);
        return;
    }
    
    // Iniciar transacción
    $conn->begin_transaction();
    
    try {
        // Insertar pedido (AHORA INCLUYE nombre_pasajero)
        $sql = "INSERT INTO pedidos (habitacion, nombre_pasajero, horario, desayunos, variaciones, nota, total_pasajeros, idioma, fecha_desayuno, estado_cocina, fecha_estado) 
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'nuevo', NOW())";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("isssssiss", $habitacion, $nombre_pasajero, $horario, $desayunos, $variaciones, $nota, $totalPasajeros, $idioma, $fecha_desayuno);
        $stmt->execute();
        
        // Actualizar disponibilidad
        $nuevosReservados = $disp['reservados'] + $totalPasajeros;
        $sql = "UPDATE disponibilidad SET reservados = ? WHERE fecha = ? AND horario = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("iss", $nuevosReservados, $fecha_desayuno, $horario);
        $stmt->execute();

        // Marcar desayuno como pedido en check-in (anti-duplicidad)
        $checkinId = (int)$rowCI['id'];
        $sqlMark = "UPDATE checkin SET desayuno_pedido = 1 WHERE id = ?";
        $stmtMark = $conn->prepare($sqlMark);
        $stmtMark->bind_param("i", $checkinId);
        $stmtMark->execute();
        
        $conn->commit();
        sendJsonResponse(['success' => true, 'message' => 'Pedido registrado correctamente']);
        
    } catch (Exception $e) {
        $conn->rollback();
        sendJsonResponse(['success' => false, 'error' => 'Error al registrar pedido: ' . $e->getMessage()]);
    }
}

function eliminarPedido($conn) {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        sendJsonResponse(['success' => false, 'error' => 'Método no permitido']);
        return;
    }
    
    $data = json_decode(file_get_contents('php://input'), true);
    
    if (!$data || !isset($data['pedido_id'])) {
        sendJsonResponse(['success' => false, 'error' => 'Datos incompletos']);
        return;
    }
    
    $pedido_id = (int)$data['pedido_id'];
    
    // Iniciar transacción
    $conn->begin_transaction();
    
    try {
        // Obtener información del pedido antes de eliminarlo
        $sql = "SELECT habitacion, horario, total_pasajeros, fecha_desayuno FROM pedidos WHERE id = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("i", $pedido_id);
        $stmt->execute();
        $result = $stmt->get_result();
        $pedido = $result->fetch_assoc();
        
        if (!$pedido) {
            throw new Exception('Pedido no encontrado');
        }
        
        // Actualizar disponibilidad (restar los pasajeros)
        $sql = "UPDATE disponibilidad SET reservados = reservados - ? WHERE fecha = ? AND horario = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("iss", $pedido['total_pasajeros'], $pedido['fecha_desayuno'], $pedido['horario']);
        $stmt->execute();
        
        // Marcar desayuno_pedido = 0 en checkin para esa habitación (solo si es hoy)
        $hoy = date('Y-m-d');
        if ($pedido['fecha_desayuno'] === $hoy) {
            $sql = "UPDATE checkin SET desayuno_pedido = 0 WHERE habitacion = ? AND activo = 1";
            $stmt = $conn->prepare($sql);
            $stmt->bind_param("i", $pedido['habitacion']);
            $stmt->execute();
        }
        
        // Eliminar el pedido
        $sql = "DELETE FROM pedidos WHERE id = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("i", $pedido_id);
        $stmt->execute();
        
        if ($stmt->affected_rows === 0) {
            throw new Exception('No se pudo eliminar el pedido');
        }
        
        $conn->commit();
        sendJsonResponse(['success' => true, 'message' => 'Pedido eliminado correctamente']);
        
    } catch (Exception $e) {
        $conn->rollback();
        sendJsonResponse(['success' => false, 'error' => 'Error al eliminar pedido: ' . $e->getMessage()]);
    }
}

function reiniciarDia($conn) {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        sendJsonResponse(['success' => false, 'error' => 'Método no permitido']);
        return;
    }
    
    $data = json_decode(file_get_contents('php://input'), true);
    $fecha = $data['fecha'] ?? date('Y-m-d');
    
    $conn->begin_transaction();
    
    try {
        // NOTA: Los pedidos NO se eliminan desde admin.
        // Solo se resetea disponibilidad y flags de habitaciones.
        // Los pedidos solo pueden borrarse desde kitchen (limpiarPedidosKitchen).

        // Reiniciar disponibilidad
        $sql = "UPDATE disponibilidad SET reservados = 0 WHERE fecha = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("s", $fecha);
        $stmt->execute();
        
        // Resetear flag desayuno_pedido en habitaciones activas
        $hoy = date('Y-m-d');
        if ($fecha === $hoy) {
            $conn->query("UPDATE checkin SET desayuno_pedido = 0 WHERE activo = 1");
        }
        
        $conn->commit();
        sendJsonResponse([
            'success' => true,
            'message' => "Día {$fecha} reiniciado. Disponibilidad y habitaciones liberadas. (Los pedidos de cocina se mantienen intactos)"
        ]);
        
    } catch (Exception $e) {
        $conn->rollback();
        sendJsonResponse(['success' => false, 'error' => 'Error al reiniciar día: ' . $e->getMessage()]);
    }
}

function limpiarPedidosKitchen($conn) {
    // Endpoint exclusivo para kitchen — borra pedidos del día
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        sendJsonResponse(['success' => false, 'error' => 'Método no permitido']);
        return;
    }
    
    $data = json_decode(file_get_contents('php://input'), true);
    $fecha = $data['fecha'] ?? date('Y-m-d');
    
    $conn->begin_transaction();
    
    try {
        $sql = "DELETE FROM pedidos WHERE fecha_desayuno = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("s", $fecha);
        $stmt->execute();
        $eliminados = $stmt->affected_rows;
        
        $conn->commit();
        sendJsonResponse([
            'success' => true,
            'message' => "{$eliminados} pedido(s) eliminado(s) de cocina para el día {$fecha}."
        ]);
        
    } catch (Exception $e) {
        $conn->rollback();
        sendJsonResponse(['success' => false, 'error' => 'Error al limpiar pedidos: ' . $e->getMessage()]);
    }
}

function getEstadisticas($conn) {
    $fecha = $_GET['fecha'] ?? date('Y-m-d');
    
    $sql = "SELECT desayunos, total_pasajeros, estado_cocina FROM pedidos WHERE fecha_desayuno = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("s", $fecha);
    $stmt->execute();
    $result = $stmt->get_result();
    
    $totalReservas = 0;
    $totalPedidos = 0;
    $desglose = [1 => 0, 2 => 0, 3 => 0, 4 => 0];
    $estados = ['nuevo' => 0, 'preparacion' => 0, 'listo' => 0, 'completado' => 0];
    
    while ($row = $result->fetch_assoc()) {
        $totalReservas += (int)$row['total_pasajeros'];
        $totalPedidos++;
        
        $desayunos = json_decode($row['desayunos'], true);
        if ($desayunos) {
            foreach ($desayunos as $d) {
                $id = $d['id'];
                if (isset($desglose[$id])) {
                    $desglose[$id] += (int)$d['cantidad'];
                }
            }
        }
        
        $estado = $row['estado_cocina'] ?? 'nuevo';
        if (isset($estados[$estado])) {
            $estados[$estado]++;
        }
    }
    
    sendJsonResponse([
        'totalReservas' => $totalReservas,
        'totalPedidos' => $totalPedidos,
        'desglose' => $desglose,
        'estados' => $estados
    ]);
}

function actualizarEstadoPedido($conn) {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        sendJsonResponse(['success' => false, 'error' => 'Método no permitido']);
        return;
    }
    
    $data = json_decode(file_get_contents('php://input'), true);
    
    if (!$data || !isset($data['pedido_id']) || !isset($data['estado'])) {
        sendJsonResponse(['success' => false, 'error' => 'Datos incompletos']);
        return;
    }
    
    $pedido_id = (int)$data['pedido_id'];
    $estado = $data['estado'];
    
    $estadosPermitidos = ['nuevo', 'preparacion', 'listo', 'completado'];
    if (!in_array($estado, $estadosPermitidos)) {
        sendJsonResponse(['success' => false, 'error' => 'Estado no válido']);
        return;
    }
    
    $sql = "UPDATE pedidos SET estado_cocina = ?, fecha_estado = NOW() WHERE id = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("si", $estado, $pedido_id);
    
    if ($stmt->execute()) {
        sendJsonResponse(['success' => true, 'message' => 'Estado actualizado']);
    } else {
        sendJsonResponse(['success' => false, 'error' => 'Error al actualizar estado']);
    }
}

function getResumenEstados($conn) {
    $fecha = $_GET['fecha'] ?? date('Y-m-d');
    
    $sql = "SELECT estado_cocina, COUNT(*) as total FROM pedidos WHERE fecha_desayuno = ? GROUP BY estado_cocina";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("s", $fecha);
    $stmt->execute();
    $result = $stmt->get_result();
    
    $resumen = ['nuevo' => 0, 'preparacion' => 0, 'listo' => 0, 'completado' => 0];
    
    while ($row = $result->fetch_assoc()) {
        $estado = $row['estado_cocina'] ?? 'nuevo';
        $resumen[$estado] = (int)$row['total'];
    }
    
    sendJsonResponse($resumen);
}

// ============================================================
// FUNCIONES CHECK-IN
// ============================================================

function getHabitacionesActivas($conn) {
    // Usar zona horaria de Chile para evitar desfase UTC
    date_default_timezone_set('America/Santiago');
    $hoy = date('Y-m-d');
    // Muestra todas las habitaciones con check-in activo y checkout vigente
    // Un huésped con checkout = hoy aún está en el hotel (sale durante el día)
    $sql = "SELECT habitacion, nombre_huesped, num_pasajeros, desayuno_pedido, fecha_checkin, fecha_checkout
            FROM checkin 
            WHERE activo = 1 
              AND fecha_checkout >= ?
            ORDER BY habitacion";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("s", $hoy);
    $stmt->execute();
    $result = $stmt->get_result();
    $lista = [];
    while ($row = $result->fetch_assoc()) {
        $lista[] = [
            'habitacion'     => (int)$row['habitacion'],
            'nombre_huesped' => $row['nombre_huesped'],
            'num_pasajeros'  => (int)$row['num_pasajeros'],
            'desayuno_pedido'=> (int)$row['desayuno_pedido'],
            'fecha_checkin'  => $row['fecha_checkin'],
            'fecha_checkout' => $row['fecha_checkout']
        ];
    }
    sendJsonResponse($lista);
}

function verificarHabitacion($conn) {
    $habitacion = (int)($_GET['habitacion'] ?? 0);
    if (!$habitacion) {
        sendJsonResponse(['activo' => false, 'mensaje' => 'Habitación inválida']);
        return;
    }
    $sql = "SELECT habitacion, nombre_huesped, num_pasajeros, desayuno_pedido
            FROM checkin WHERE habitacion = ? AND activo = 1 LIMIT 1";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("i", $habitacion);
    $stmt->execute();
    $row = $stmt->get_result()->fetch_assoc();
    if ($row) {
        sendJsonResponse([
            'activo'          => true,
            'habitacion'      => (int)$row['habitacion'],
            'nombre_huesped'  => $row['nombre_huesped'],
            'num_pasajeros'   => (int)$row['num_pasajeros'],
            'desayuno_pedido' => (int)$row['desayuno_pedido']
        ]);
    } else {
        sendJsonResponse(['activo' => false,
            'mensaje' => 'Habitación sin check-in activo']);
    }
}

function getCheckins($conn) {
    $sql = "SELECT * FROM checkin ORDER BY activo DESC, habitacion ASC";
    $result = $conn->query($sql);
    $lista = [];
    while ($row = $result->fetch_assoc()) {
        $lista[] = [
            'id'             => (int)$row['id'],
            'habitacion'     => (int)$row['habitacion'],
            'nombre_huesped' => $row['nombre_huesped'],
            'num_pasajeros'  => (int)$row['num_pasajeros'],
            'fecha_checkin'  => $row['fecha_checkin'],
            'fecha_checkout' => $row['fecha_checkout'],
            'activo'         => (int)$row['activo'],
            'desayuno_pedido'=> (int)$row['desayuno_pedido'],
            'created_at'     => $row['created_at']
        ];
    }
    sendJsonResponse($lista);
}

function registrarCheckin($conn) {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        sendJsonResponse(['success' => false, 'error' => 'Método no permitido']); return;
    }
    $data = json_decode(file_get_contents('php://input'), true);
    if (!$data) {
        sendJsonResponse(['success' => false, 'error' => 'Datos inválidos']); return;
    }

    $habitacion     = (int)($data['habitacion'] ?? 0);
    $nombre_huesped = trim($data['nombre_huesped'] ?? '');
    $num_pasajeros  = max(1, (int)($data['num_pasajeros'] ?? 1));
    $fecha_checkin  = $data['fecha_checkin']  ?? date('Y-m-d');
    $fecha_checkout = $data['fecha_checkout'] ?? date('Y-m-d', strtotime('+1 day'));

    if (!$habitacion || !$nombre_huesped) {
        sendJsonResponse(['success' => false, 'error' => 'Habitación y nombre son obligatorios']); return;
    }
    if ($habitacion < 15 || $habitacion > 34) {
        sendJsonResponse(['success' => false, 'error' => 'Habitación fuera de rango (15-34)']); return;
    }

    // Upsert: si ya existe actualizar, si no insertar
    $sql = "INSERT INTO checkin (habitacion, nombre_huesped, num_pasajeros, fecha_checkin, fecha_checkout, activo, desayuno_pedido)
            VALUES (?, ?, ?, ?, ?, 1, 0)
            ON DUPLICATE KEY UPDATE
                nombre_huesped  = VALUES(nombre_huesped),
                num_pasajeros   = VALUES(num_pasajeros),
                fecha_checkin   = VALUES(fecha_checkin),
                fecha_checkout  = VALUES(fecha_checkout),
                activo          = 1,
                desayuno_pedido = 0";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("isiss", $habitacion, $nombre_huesped, $num_pasajeros, $fecha_checkin, $fecha_checkout);
    if ($stmt->execute()) {
        sendJsonResponse(['success' => true, 'message' => 'Check-in registrado para habitación ' . $habitacion]);
    } else {
        sendJsonResponse(['success' => false, 'error' => 'Error al registrar check-in: ' . $conn->error]);
    }
}

function registrarCheckout($conn) {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        sendJsonResponse(['success' => false, 'error' => 'Método no permitido']); return;
    }
    $data = json_decode(file_get_contents('php://input'), true);
    $habitacion = (int)($data['habitacion'] ?? 0);
    if (!$habitacion) {
        sendJsonResponse(['success' => false, 'error' => 'Habitación requerida']); return;
    }
    $sql = "UPDATE checkin SET activo = 0 WHERE habitacion = ? AND activo = 1";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("i", $habitacion);
    if ($stmt->execute() && $stmt->affected_rows > 0) {
        sendJsonResponse(['success' => true, 'message' => 'Check-out registrado para habitación ' . $habitacion]);
    } else {
        sendJsonResponse(['success' => false, 'error' => 'No se encontró check-in activo para esa habitación']);
    }
}

function resetearDesayunoDiario($conn) {
    // Llamar al inicio de cada día para resetear el flag desayuno_pedido
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        sendJsonResponse(['success' => false, 'error' => 'Método no permitido']); return;
    }
    $sql = "UPDATE checkin SET desayuno_pedido = 0 WHERE activo = 1";
    $conn->query($sql);
    sendJsonResponse(['success' => true, 'message' => 'Flags de desayuno reiniciados']);
}

function resetearHabitacion($conn) {
    // Resetea el flag desayuno_pedido de una habitación individual
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        sendJsonResponse(['success' => false, 'error' => 'Método no permitido']); return;
    }
    $data = json_decode(file_get_contents('php://input'), true);
    $habitacion = (int)($data['habitacion'] ?? 0);
    if (!$habitacion) {
        sendJsonResponse(['success' => false, 'error' => 'Habitación inválida']); return;
    }
    $sql = "UPDATE checkin SET desayuno_pedido = 0 WHERE habitacion = ? AND activo = 1";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("i", $habitacion);
    $stmt->execute();
    if ($stmt->affected_rows > 0) {
        sendJsonResponse(['success' => true, 'message' => "Habitación {$habitacion} habilitada para solicitar desayuno"]);
    } else {
        sendJsonResponse(['success' => false, 'error' => "No se encontró check-in activo para la habitación {$habitacion}"]);
    }
}


function getInformeRango($conn) {
    $desde = $_GET['desde'] ?? date('Y-m-d');
    $hasta = $_GET['hasta'] ?? date('Y-m-d');

    // Total pedidos y desayunos en el rango
    $sql = "SELECT fecha_desayuno, desayunos, total_pasajeros, horario, habitacion
            FROM pedidos WHERE fecha_desayuno BETWEEN ? AND ? ORDER BY fecha_desayuno";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("ss", $desde, $hasta);
    $stmt->execute();
    $result = $stmt->get_result();

    $totalPedidos   = 0;
    $totalDesayunos = 0;
    $porTipo        = [1=>0, 2=>0, 3=>0, 4=>0];
    $porHorario     = [];
    $porDia         = []; // fecha => count desayunos
    $porHabitacion  = [];

    while ($row = $result->fetch_assoc()) {
        $totalPedidos++;
        $totalDesayunos += (int)$row['total_pasajeros'];

        $fecha   = $row['fecha_desayuno'];
        $horario = $row['horario'];
        $hab     = $row['habitacion'];

        // Por día
        if (!isset($porDia[$fecha])) $porDia[$fecha] = 0;
        $porDia[$fecha] += (int)$row['total_pasajeros'];

        // Por horario
        if (!isset($porHorario[$horario])) $porHorario[$horario] = 0;
        $porHorario[$horario] += (int)$row['total_pasajeros'];

        // Por habitación
        if (!isset($porHabitacion[$hab])) $porHabitacion[$hab] = 0;
        $porHabitacion[$hab] += (int)$row['total_pasajeros'];

        // Por tipo de desayuno
        $desayunos = json_decode($row['desayunos'], true);
        if ($desayunos) {
            foreach ($desayunos as $d) {
                $id  = (int)$d['id'];
                $qty = (int)($d['cantidad'] ?? 1);
                if (isset($porTipo[$id])) $porTipo[$id] += $qty;
            }
        }
    }

    // Días únicos con pedidos
    $diasConPedidos = count($porDia);
    $promedioDiario = $diasConPedidos > 0 ? round($totalDesayunos / $diasConPedidos, 1) : 0;

    // Ranking tipos
    arsort($porTipo);
    $rankingTipos = [];
    foreach ($porTipo as $id => $qty) {
        $rankingTipos[] = ['id' => $id, 'cantidad' => $qty];
    }

    // Horario más demandado
    arsort($porHorario);

    sendJsonResponse([
        'totalPedidos'    => $totalPedidos,
        'totalDesayunos'  => $totalDesayunos,
        'promedioDiario'  => $promedioDiario,
        'diasConPedidos'  => $diasConPedidos,
        'rankingTipos'    => $rankingTipos,
        'porHorario'      => $porHorario,
        'porDia'          => $porDia,
        'desde'           => $desde,
        'hasta'           => $hasta,
    ]);
}

function eliminarCheckin($conn) {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        sendJsonResponse(['success' => false, 'error' => 'Método no permitido']); return;
    }
    $data = json_decode(file_get_contents('php://input'), true);
    $id = (int)($data['id'] ?? 0);
    if (!$id) {
        sendJsonResponse(['success' => false, 'error' => 'ID inválido']); return;
    }
    // Solo permite eliminar registros con activo = 0 (ya tienen check-out)
    $sql = "DELETE FROM checkin WHERE id = ? AND activo = 0";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("i", $id);
    if ($stmt->execute() && $stmt->affected_rows > 0) {
        sendJsonResponse(['success' => true, 'message' => 'Registro eliminado']);
    } else {
        sendJsonResponse(['success' => false, 'error' => 'No se pudo eliminar (solo se pueden eliminar check-outs cerrados)']);
    }
}
?>