<?php
// api.php - COMPLETO CON NOMBRE PASAJERO
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 'getEstadisticas':
        getEstadisticas($conn);
        break;
    case 'verificarConexion':
        sendJsonResponse(['success' => true, 'mensaje' => 'Conexión exitosa']);
        break;
    case 'actualizarEstadoPedido':
        actualizarEstadoPedido($conn);
        break;
    case 'getResumenEstados':
        getResumenEstados($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 = $data['habitacion'] ?? '';
    $nombre_pasajero = $data['nombre_pasajero'] ?? '';
    $horario = $data['horario'] ?? '';
    $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();
        
        $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 reiniciarDia($conn) {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        sendJsonResponse(['success' => false, 'error' => 'Método no permitido']);
        return;
    }
    
    $fecha = $_POST['fecha'] ?? date('Y-m-d');
    
    $conn->begin_transaction();
    
    try {
        // Eliminar pedidos del día
        $sql = "DELETE FROM pedidos WHERE fecha_desayuno = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("s", $fecha);
        $stmt->execute();
        
        // Reiniciar disponibilidad
        $sql = "UPDATE disponibilidad SET reservados = 0 WHERE fecha = ?";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("s", $fecha);
        $stmt->execute();
        
        $conn->commit();
        sendJsonResponse(['success' => true, 'message' => 'Día reiniciado correctamente']);
        
    } catch (Exception $e) {
        $conn->rollback();
        sendJsonResponse(['success' => false, 'error' => 'Error al reiniciar día: ' . $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);
}
?>