#!/bin/bash
set -eu

# 🛠 Actualizar repositorios
echo "Actualizando repositorios..."
apt-get update

# 🛠 Instalar Node.js, NPM, y dependencias necesarias si no están instalados
echo "Instalando Node.js, NPM y dependencias necesarias..."
apt-get install -y curl python3 make g++ git libc-dev bash

# 🛠 Instalar n (gestor de versiones de Node.js) globalmente
echo "Instalando el gestor de versiones 'n' para Node.js..."
curl -L https://raw.githubusercontent.com/tj/n/master/bin/n -o /usr/local/bin/n
chmod +x /usr/local/bin/n

# 🛠 Eliminar versiones conflictivas de Node.js y NPM
echo "Eliminando binarios conflictivos..."
rm -f /usr/local/bin/node || true
rm -f /usr/local/bin/npm || true
rm -f /usr/local/bin/npx || true

# 🛠 Crear directorio para versiones globales de Node.js si no existe
mkdir -p /usr/local/n
chown -R $(whoami) /usr/local/n
export N_PREFIX=/usr/local/n

# 🛠 Agregar N_PREFIX al PATH si no está
if ! grep -q "/usr/local/n/bin" <<< "$PATH"; then
    export PATH="/usr/local/n/bin:$PATH"
    echo 'export PATH="/usr/local/n/bin:$PATH"' >> ~/.bashrc
    source ~/.bashrc
fi

# 🛠 Función para configurar la versión de Node.js
setup_node_version() {
    local VERSION=$1
    echo "Instalando Node.js v$VERSION..."
    n $VERSION

    # 🛠 Crear enlaces simbólicos globales
    ln -sf /usr/local/n/bin/node /usr/local/bin/node
    ln -sf /usr/local/n/bin/npm /usr/local/bin/npm
    ln -sf /usr/local/n/bin/npx /usr/local/bin/npx

    # 🛠 Actualizar el PATH y limpiar caché de comandos
    export PATH="/usr/local/n/bin:$PATH"
    hash -r

    # 🛠 Mostrar la versión instalada
    echo "Node.js actualizado a:"
    node -v
    npm -v
}

# 🛠 Preguntar al usuario qué versión quiere instalar
echo "¿Qué versión de Node.js deseas instalar? (Ejemplo: 20)"
read -r NODE_VERSION

# 🛠 Ejecutar la instalación de la versión solicitada
setup_node_version $NODE_VERSION

# 🛠 Instrucciones para cambiar de versión rápidamente
cat << EOF

¡Node.js v$NODE_VERSION instalado correctamente! 🎉

Para cambiar de versión en el futuro, usa:
  n <versión>        # Ejemplo: n 18

Para listar versiones disponibles:
  n ls-remote

Para listar versiones instaladas localmente:
  n ls

Para borrar una versión específica:
  n rm <versión>     # Ejemplo: n rm 18

¡Disfruta usando Node.js con n! 🚀
EOF