#!/bin/bash
# Node.js 升级脚本 - 升级到 Node.js 20.x

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

echo ""
echo -e "${BLUE}==========================================${NC}"
echo -e "${BLUE}  Node.js 升级脚本${NC}"
echo -e "${BLUE}  目标版本: Node.js >= 20.9.0${NC}"
echo -e "${BLUE}==========================================${NC}"
echo ""

# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FRONTEND_DIR="$SCRIPT_DIR/frontend-react"

# 检查当前版本
CURRENT_VERSION=$(node --version 2>/dev/null || echo "未安装")
echo -e "当前 Node.js 版本: ${YELLOW}$CURRENT_VERSION${NC}"
echo ""

# 检查是否已经满足要求
check_version_ok() {
    if command -v node &> /dev/null; then
        local version=$(node --version | sed 's/v//')
        local major=$(echo "$version" | cut -d'.' -f1)
        local minor=$(echo "$version" | cut -d'.' -f2)
        if [ "$major" -gt 20 ] || ([ "$major" -eq 20 ] && [ "$minor" -ge 9 ]); then
            return 0
        fi
    fi
    return 1
}

if check_version_ok; then
    echo -e "${GREEN}✅ Node.js 版本已满足要求 (>= 20.9.0)${NC}"
    echo ""
    read -p "是否仍要继续升级? (y/N): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo "已取消"
        exit 0
    fi
fi

# 安装成功后的处理
install_success() {
    echo ""
    echo -e "${GREEN}==========================================${NC}"
    echo -e "${GREEN}✅ Node.js 安装/升级成功！${NC}"
    echo -e "${GREEN}==========================================${NC}"
    echo -e "   Node.js 版本: ${YELLOW}$(node --version)${NC}"
    echo -e "   npm 版本:     ${YELLOW}$(npm --version)${NC}"
    echo ""
    
    # 验证版本是否满足要求
    if check_version_ok; then
        echo -e "${GREEN}✅ 版本满足 Next.js 要求 (>= 20.9.0)${NC}"
    else
        echo -e "${RED}⚠️  版本仍不满足要求，请手动安装更新版本${NC}"
        exit 1
    fi
    
    # 询问是否重新安装前端依赖
    echo ""
    if [ -d "$FRONTEND_DIR" ]; then
        echo -e "${YELLOW}检测到前端目录: $FRONTEND_DIR${NC}"
        read -p "是否重新安装前端依赖? (Y/n): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Nn]$ ]]; then
            echo ""
            echo -e "${BLUE}正在重新安装前端依赖...${NC}"
            cd "$FRONTEND_DIR"
            rm -rf node_modules package-lock.json 2>/dev/null || true
            npm install
            echo ""
            echo -e "${GREEN}✅ 前端依赖安装完成${NC}"
        fi
    fi
    
    echo ""
    echo -e "${GREEN}🎉 全部完成！${NC}"
    echo ""
    echo -e "${YELLOW}💡 提示:${NC}"
    echo "   如果使用 nvm，请在新终端中运行或执行:"
    echo "   source ~/.bashrc"
    echo ""
}

# 方法1: 尝试使用 nvm（如果已安装）
if [ -s "$HOME/.nvm/nvm.sh" ]; then
    echo -e "${GREEN}✅ 检测到 nvm，使用 nvm 安装 Node.js 20...${NC}"
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
    
    nvm install 20
    nvm use 20
    nvm alias default 20
    
    install_success
    exit 0
fi

# 方法2: 安装 nvm 然后使用
echo -e "${BLUE}📦 方法1: 尝试安装 nvm...${NC}"
if command -v curl &> /dev/null; then
    echo "   正在安装 nvm..."
    export NVM_DIR="$HOME/.nvm"
    mkdir -p "$NVM_DIR"
    
    NVM_INSTALLED=false
    
    # 尝试使用 GitHub 安装
    if curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash 2>/dev/null; then
        echo -e "   ${GREEN}✅ nvm 安装成功（使用 GitHub）${NC}"
        NVM_INSTALLED=true
    # 备用：尝试使用镜像源安装
    elif curl -fsSL https://gitee.com/mirrors/nvm/raw/master/install.sh | bash 2>/dev/null; then
        echo -e "   ${GREEN}✅ nvm 安装成功（使用 Gitee 镜像）${NC}"
        NVM_INSTALLED=true
    else
        echo -e "   ${YELLOW}⚠️  nvm 安装失败，尝试其他方法...${NC}"
    fi
    
    # 如果 nvm 安装成功，使用它
    if [ "$NVM_INSTALLED" = true ] && [ -s "$NVM_DIR/nvm.sh" ]; then
        [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
        nvm install 20
        nvm use 20
        nvm alias default 20
        
        # 添加到 .bashrc
        if ! grep -q "NVM_DIR" ~/.bashrc 2>/dev/null; then
            echo "" >> ~/.bashrc
            echo "# NVM - Node Version Manager" >> ~/.bashrc
            echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.bashrc
            echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.bashrc
            echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"' >> ~/.bashrc
            echo -e "   ${GREEN}✅ 已添加 nvm 到 ~/.bashrc${NC}"
        fi
        
        install_success
        exit 0
    fi
fi

# 方法3: 使用 NodeSource 仓库（Ubuntu/Debian）
echo ""
echo -e "${BLUE}📦 方法2: 使用 NodeSource 仓库安装 Node.js 20...${NC}"
if command -v apt-get &> /dev/null; then
    echo "   检测到 apt 包管理器，使用 NodeSource 安装..."
    
    # 检查是否有 sudo 权限
    if ! sudo -n true 2>/dev/null; then
        echo -e "   ${YELLOW}需要 sudo 权限，请输入密码${NC}"
    fi
    
    # 检查是否已安装旧版 Node.js
    if command -v node &> /dev/null; then
        echo -e "   ${YELLOW}⚠️  检测到已安装的 Node.js，将先卸载...${NC}"
        sudo apt-get remove -y nodejs npm 2>/dev/null || true
        sudo apt-get autoremove -y 2>/dev/null || true
    fi
    
    # 安装 Node.js 20.x
    echo "   正在设置 NodeSource 仓库..."
    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
    
    echo "   正在安装 Node.js..."
    sudo apt-get install -y nodejs
    
    install_success
    exit 0
fi

# 方法4: 使用 yum/dnf (CentOS/RHEL/Fedora)
if command -v dnf &> /dev/null || command -v yum &> /dev/null; then
    echo ""
    echo -e "${BLUE}📦 方法2b: 使用 NodeSource 仓库 (RHEL/CentOS/Fedora)...${NC}"
    
    # 检查是否有 sudo 权限
    if ! sudo -n true 2>/dev/null; then
        echo -e "   ${YELLOW}需要 sudo 权限，请输入密码${NC}"
    fi
    
    curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
    
    if command -v dnf &> /dev/null; then
        sudo dnf install -y nodejs
    else
        sudo yum install -y nodejs
    fi
    
    install_success
    exit 0
fi

# 方法5: 使用二进制安装
echo ""
echo -e "${BLUE}📦 方法3: 使用二进制文件安装...${NC}"
ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ]; then
    ARCH="x64"
elif [ "$ARCH" = "aarch64" ]; then
    ARCH="arm64"
elif [ "$ARCH" = "armv7l" ]; then
    ARCH="armv7l"
else
    echo -e "${RED}❌ 不支持的架构: $ARCH${NC}"
    exit 1
fi

NODE_VERSION="20.18.0"
INSTALL_DIR="/usr/local"
NODE_TAR="node-v${NODE_VERSION}-linux-${ARCH}.tar.xz"
NODE_URL="https://nodejs.org/dist/v${NODE_VERSION}/${NODE_TAR}"

echo "   架构: $ARCH"
echo "   目标版本: $NODE_VERSION"
echo "   正在下载 Node.js ${NODE_VERSION}..."

cd /tmp
if curl -fsSL --progress-bar "$NODE_URL" -o "$NODE_TAR"; then
    echo "   正在解压..."
    tar -xf "$NODE_TAR"
    
    echo "   正在安装到 $INSTALL_DIR... (需要 sudo 权限)"
    sudo cp -r "node-v${NODE_VERSION}-linux-${ARCH}"/* "$INSTALL_DIR/"
    
    # 清理
    rm -rf "node-v${NODE_VERSION}-linux-${ARCH}" "$NODE_TAR"
    
    # 刷新 hash
    hash -r 2>/dev/null || true
    
    install_success
    exit 0
else
    echo -e "   ${RED}❌ 下载失败${NC}"
fi

# 所有方法都失败
echo ""
echo -e "${RED}❌ 所有安装方法都失败了${NC}"
echo ""
echo -e "${YELLOW}💡 手动安装建议：${NC}"
echo "   1. 访问 https://nodejs.org/ 下载 Node.js 20.x LTS"
echo "   2. 或使用系统包管理器安装"
echo "   3. 或联系管理员协助安装"
echo ""
echo "   对于 Ubuntu/Debian:"
echo "   curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -"
echo "   sudo apt-get install -y nodejs"
echo ""
echo "   对于 macOS:"
echo "   brew install node@20"
echo ""
exit 1
