#!/usr/bin/env bash

set -e
export UUID=${UUID:-$(uuidgen -r)}
export DEBIAN_FRONTEND=noninteractive

# 安装目录
APP_DIR="/opt/myapp"
STATE_FILE="${APP_DIR}/.project_type"
APP_NAME=$(tr -dc a-z </dev/urandom | head -c 6)
SUBPATH=${UUID}

[[ $EUID -ne 0 ]] && echo -e "\033[1;91m请root用户下运行脚本，输入：sudo -i 切换到root用户后再次运行！\033[0m" && exit 1

# 卸载模式：支持 -u 或 uni
if [[ "$1" == "-u" || "$1" == "u" || "$1" == "uninstall" ]]; then
    echo "执行卸载操作..."

    if [[ -f "${STATE_FILE}" ]]; then
        INSTALLED_TYPE=$(cat "${STATE_FILE}")
        echo "检测到已安装项目: ${INSTALLED_TYPE}"
    else
        echo "未检测到项目状态文件，将执行清理..."
        INSTALLED_TYPE="unknown"
    fi

    pm2 delete all 2>/dev/null || true
    pm2 save >/dev/null 2>&1 || true

    echo "删除 PM2 开机自启"
    pm2 unstartup systemd -u root --hp /root >/dev/null 2>&1 || true

    echo "删除项目目录"
    rm -rf "${APP_DIR}"

    echo ""
    echo -e "\e[1;32m卸载完成\033[0m"
    exit 0
fi

# 随机选择项目类型
if [[ "$1" == "-js" || "$1" == "js" || "$1" == "nodejs" ]]; then
    PROJECT_TYPE="nodejs"
elif [[ "$1" == "-py" || "$1" == "py" || "$1" == "python" ]]; then
    PROJECT_TYPE="python"
elif [[ -z "$1" ]]; then
    RANDOM_CHOICE=$((RANDOM % 2))
    if [[ $RANDOM_CHOICE -eq 0 ]]; then
        PROJECT_TYPE="nodejs"
        echo -e "\e[1;33m未指定项目类型，随机选择: Nodejs\033[0m"
    else
        PROJECT_TYPE="python"
        echo -e "\e[1;33m未指定项目类型，随机选择: Python\033[0m"
    fi
else
    echo -e "\e[1;31m错误：无效参数\033[0m"
    echo "用法："
    echo "  bash air.sh         随机选择 Nodejs 或 Python 项目"
    echo "  bash air.sh -js     启动 Node.js 项目"
    echo "  bash air.sh -py     启动 Python 项目"
    echo "  bash air.sh -u      卸载项目"
    exit 1
fi

# 安装公共依赖
echo "安装依赖中，请稍等..."

apt-get update -qq

apt-get install -y -qq \
curl \
wget \
git \
ca-certificates \
gnupg >/dev/null 2>&1

mkdir -p "${APP_DIR}"
echo "${PROJECT_TYPE}" > "${STATE_FILE}"
cd "${APP_DIR}"

# Node.js 项目流程
if [[ "$PROJECT_TYPE" == "nodejs" ]]; then
    echo "正在安装 Node.js，请稍等..."
    curl -fsSL https://deb.nodesource.com/setup_current.x | bash - >/dev/null 2>&1
    apt-get install -y -qq nodejs >/dev/null 2>&1

    echo "正在安装 PM2，请稍等..."
    npm install -g pm2 >/dev/null 2>&1

    echo "下载核心文件..."
    wget -q -O index.html https://raw.githubusercontent.com/eooce/node-ws/main/index.html
    wget -q -O index.js https://raw.githubusercontent.com/eooce/node-ws/main/index.js

    echo "初始化 npm ..."
    npm init -y >/dev/null 2>&1

    echo "安装项目依赖中, 请稍等..."
    npm install axios ws javascript-obfuscator >/dev/null 2>&1
    
    echo "配置 UUID 和路径..."
    sed -i "13s/const UUID = process.env.UUID || '[^']*'/const UUID = process.env.UUID || '${UUID}'/" index.js
    sed -i "20s/|| 'sub'/|| '${SUBPATH}'/" index.js

    echo "正在混淆文件..."
    npx javascript-obfuscator index.js \
    --output ${APP_NAME}.js \
    --compact true \
    --control-flow-flattening true \
    --control-flow-flattening-threshold 0.5 \
    --dead-code-injection true \
    --dead-code-injection-threshold 0.2 \
    --string-array true \
    --string-array-threshold 0.75 \
    --rename-globals false \
    >/dev/null 2>&1

    rm -f index.js  >/dev/null 2>&1

    echo "启动项目..."
    pm2 start ${APP_NAME}.js --name "${APP_NAME}" >/dev/null 2>&1

# Python 项目流程
elif [[ "$PROJECT_TYPE" == "python" ]]; then
    echo "正在安装Python3和虚拟环境..."
    apt-get install -y -qq python3 python3-venv python3-pip >/dev/null 2>&1
    
    if ! command -v python3 &> /dev/null; then
        echo -e "\e[1;31mPython3 安装失败\033[0m"
        exit 1
    fi

    echo "正在安装 PM2 ..."
    if ! command -v pm2 &> /dev/null; then
        if ! command -v node &> /dev/null; then
            curl -fsSL https://deb.nodesource.com/setup_current.x | bash - >/dev/null 2>&1
            apt-get install -y -qq nodejs >/dev/null 2>&1
        fi
        npm install -g pm2 >/dev/null 2>&1
    fi

    echo "下载 Python 项目文件..."
    wget -q -O app.py https://github.com/eooce/python-ws/raw/refs/heads/main/app.py
    wget -q -O index.html https://github.com/eooce/python-ws/raw/refs/heads/main/index.html
    wget -q -O requirements.txt https://github.com/eooce/python-ws/raw/refs/heads/main/requirements.txt

    echo "创建 Python 虚拟环境..."
    python3 -m venv venv
    source venv/bin/activate

    echo "安装 Python 依赖..."
    pip install --upgrade pip >/dev/null 2>&1
    pip install -r requirements.txt >/dev/null 2>&1

    echo "配置 UUID 和路径..."
    sed -i "18s/UUID = os.environ.get('UUID', '[^']*')/UUID = os.environ.get('UUID', '${UUID}')/" app.py
    sed -i "23s/SUB_PATH = os.environ.get('SUB_PATH', 'sub')/SUB_PATH = os.environ.get('SUB_PATH', '${SUBPATH}')/" app.py

    echo "正在混淆 Python 代码..."
    # 读取文件内容并进行 JSON 转义
    CODE_JSON=$(cat app.py | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))')
    
    # 调用混淆 API 并提取 obfuscated 字段
    OBFUSCATED=$(curl -s -X POST https://obf.eooce.com/api/obfuscate \
        -H "Content-Type: application/json" \
        -d "{\"code\": ${CODE_JSON}}" | \
        grep -o '"obfuscated":"[^"]*"' | \
        sed 's/"obfuscated":"//' | \
        sed 's/"$//' | \
        sed 's/\\n/\n/g' | \
        sed 's/\\"/"/g' | \
        sed 's/\\\\/\\/g')
    
    if [[ -n "${OBFUSCATED}" ]]; then
        echo "${OBFUSCATED}" > ${APP_NAME}.py
        rm -f app.py  >/dev/null 2>&1
    else
        echo -e "\e[1;33m警告：代码混淆失败，使用原始代码\033[0m"
    fi

    echo "启动 Python 项目..."
    pm2 start ${APP_NAME}.py \
        --name "${APP_NAME}" \
        --interpreter "${APP_DIR}/venv/bin/python3" \
        >/dev/null 2>&1
fi

# 公共后续操作
pm2 startup systemd -u root --hp /root >/dev/null 2>&1
pm2 save >/dev/null 2>&1


IP=$(curl -sm 5 https://api-ipv4.ip.sb/ip)

echo ""
echo -e "\e[1;32m安装完成\033[0m"
echo ""
echo "项目类型: ${PROJECT_TYPE}"
echo "APP_NAME: ${APP_NAME}"
echo "UUID: ${UUID}"
echo -e "\e[1;32m访问地址: http://${IP}:3000/${SUBPATH}\033[0m"
echo -e "\033[1;91m请注意：请将上面订阅链接里的3000改为映射后的端口再访问，获取到的节点里的3000端口也需要修改\033[0m\n"