#!/bin/sh
#############
# 脚本说明：
# 1. 执行./naive.sh start，启动naiveproxy
# 2. 执行./naive.sh stop，停止naiveproxy
# 3. 执行脚本会创建文件夹naiveproxy，并下载naiveproxy到naiveproxy目录下
# 4. 脚本会自动判断当前环境是M1还是x86，下载对应的naiveproxy
# 5. 脚本会自动创建配置文件config.json，并写入配置
# 6. 脚本会自动检测设定的端口是否被占用，如果被占用，则杀掉占用进程
# 7. 脚本会自动检测naiveproxy进程是否存在，如果存在，则杀掉进程
#############
# 定义变量
SOCKS_PORT="1080"
HTTP_PORT="1099"
PAC_URL="https://pac.disbaidu.com/gfw.pac"
PAC2_URL="https://pac.disbaidu.com/gfw2.pac"
NAIVE_DOWNLOAD_ARM64="https://sync.disbaidu.com/naive/naiveproxy-mac-arm64.tar.xz"
NAIVE_DOWNLOAD_X64="https://sync.disbaidu.com/naive/naiveproxy-mac-x64.tar.xz"
CONFIG_PROXY_URL="https://onghan:onghan@o.disbaidu.com" # 这个也建议作为变量

# 判断是否mac系统
if [ "$(uname)" != "Darwin" ]; then
    echo "当前系统不是MacOS。"
    exit 1
fi
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
cd "$SCRIPT_DIR" || { echo "错误：无法切换到脚本所在的目录。"; exit 1; }

# 判断当前是否存在naiveproxy目录，如果不存在，则创建
if [ ! -d "naiveproxy" ]; then
    mkdir -p naiveproxy || { echo "错误：无法创建 naiveproxy 目录。"; exit 1; }
    echo "创建$(pwd)/naiveproxy目录"
fi
cd naiveproxy || { echo "错误：无法切换到 naiveproxy 目录。"; exit 1; }

# 判断是否存在naive文件，如果不存在，则下载
if [ ! -f "naive" ]; then
    echo "naive文件不存在，开始下载"
    # 判断当前环境是M1还是x86，下载对应的naiveproxy
    if [ $(uname -m) = "arm64" ]; then
        echo "当前环境是M1，下载M1版naiveproxy"
        curl -L -o naive.tar.xz "$NAIVE_DOWNLOAD_ARM64"
    else
        echo "当前环境是x86，下载x86版naiveproxy"
        curl -L -o naive.tar.xz "$NAIVE_DOWNLOAD_X64"
    fi
    # 解压naive文件
    echo "解压naive文件"
    tar -xf naive.tar.xz
    mv naiveproxy-* naivetmp
    cp naivetmp/naive naive
    rm -rf naivetmp
    rm naive.tar.xz
fi
# 判断config.json文件是否存在，如果不存在，创建配置文件并写入配置
if [ ! -f "config.json" ]; then
    echo "config.json文件不存在，创建配置文件并写入配置"
    echo '{ "listen": ["socks://127.0.0.1:'"$SOCKS_PORT"'","http://127.0.0.1:'"$HTTP_PORT"'"], "proxy": "'"$CONFIG_PROXY_URL"'", "log": "o.log"}' >config.json
    sleep 2
fi
# 检测第一个参数是否为启动参数或是空，如果是，则启动naiveproxy
if [ "$1" = "start" ] || [ -z "$1" ]; then
    echo "启动naiveproxy"
    # 启动naiveproxy
    # 是否存在naive进程，如果存在，则杀掉进程
    if pgrep -f "naive"; then
        echo "naiveproxy进程存在，杀掉进程"
        killall naive
        sleep 2
    fi
# 检测socks的端口是否被占用，如果被占用，则杀掉占用进程
    if lsof -i:"$SOCKS_PORT" | grep -q "LISTEN"; then
        echo "注意：$SOCKS_PORT 端口被占用。"
        read -r -p "是否杀掉占用 $SOCKS_PORT 端口的进程？(y/N) " response
        if [[ "$response" =~ ^([yY])$ ]]; then
            echo "杀掉占用 $SOCKS_PORT 端口的进程"
            lsof -i:"$SOCKS_PORT" | awk '{print $2}' | xargs kill -9
            sleep 2
        else
            echo "用户取消，不杀掉占用 $SOCKS_PORT 端口的进程。脚本退出。"
            exit 1 # 如果端口被占用且用户选择不杀掉，通常脚本无法继续，所以选择退出
        fi
    fi
    # 检测http端口是否被占用，如果被占用，则杀掉占用进程
    if lsof -i:"$HTTP_PORT" | grep -q "LISTEN"; then
        echo "注意：$HTTP_PORT 端口被占用。"
        read -r -p "是否杀掉占用 $HTTP_PORT 端口的进程？(y/N) " response
        if [[ "$response" =~ ^([yY])$ ]]; then
            echo "杀掉占用 $HTTP_PORT 端口的进程"
            lsof -i:"$HTTP_PORT" | awk '{print $2}' | xargs kill -9
            sleep 2
        else
            echo "用户取消，不杀掉占用 $SOCKS_PORT 端口的进程。脚本退出。"
            exit 1 # 如果端口被占用且用户选择不杀掉，通常脚本无法继续，所以选择退出
        fi
    fi
    echo "开始启动naive 代理..."
    nohup "$SCRIPT_DIR"/naiveproxy/naive "$SCRIPT_DIR"/naiveproxy/config.json >/dev/null 2>&1 &
    sleep 2
        # 测试socks代理是否正常工作
        REQUESTS=$(curl -x socks5h://127.0.0.1:"$SOCKS_PORT" -m 5 -sL https://pac-9d7.pages.dev/access)
        if [ -z "$REQUESTS" ]; then
            echo "naiveproxy启动失败！"
        osascript -e 'tell app "System Events" to display dialog "代理启动失败!"  buttons {"OK"}'
            exit 1
        fi
         # 测试http代理是否正常工作
        REQUESTS=$(curl -x http://127.0.0.1:"$HTTP_PORT" -m 5 -sL https://pac-9d7.pages.dev/access)
        if [ -z "$REQUESTS" ]; then
            echo "naiveproxy启动失败！"
        osascript -e 'tell app "System Events" to display dialog "代理启动失败!"  buttons {"OK"}'
            exit 1
            fi
        
    if pgrep -f "naive"; then
        # 设置pac自动代理
        echo "设置PAC的http代理。。。"
        networksetup -setautoproxyurl Wi-Fi "$PAC_URL"
        echo "naiveproxy启动成功！"
        osascript -e 'tell app "System Events" to display dialog "代理启动成功，已设置PAC代理。直接打开浏览器就可以自由上网。\n本地代理为：http://127.0.0.1:'"$HTTP_PORT"'\n代理测试结果：'"$REQUESTS"'" buttons {"OK"}'
        exit 0
    else
        echo "naiveproxy启动失败！"
        exit 1
    fi
elif [ "$1" = "stop" ]; then
    # 取消pac自动代理
    networksetup -setautoproxystate Wi-Fi off
    echo "停止naiveproxy"
    # 停止naiveproxy
    if pgrep -f "naive"; then
        killall naive
    else
        echo "naiveproxy进程不存在"
    fi
    # 检测设定的端口是否被占用，如果被占用，则杀掉占用进程
    if lsof -i:"$SOCKS_PORT" | grep -q "LISTEN"; then
        echo "$SOCKS_PORT端口被占用，杀掉占用进程"
        lsof -i:"$SOCKS_PORT" | awk '{print $2}' | xargs kill -9
    fi
    osascript -e 'tell app "System Events" to display dialog "已关闭代理服务器，关闭PAC代理。"  buttons {"OK"}'

else
    echo "参数错误，请输入 ./naive start或 ./naive stop"
fi
