#!/bin/bash

# ========================================
# 🔧 通用代理管理工具 - 支持所有Linux发行版
# 支持 Bash, Zsh, Fish 等多种Shell
# ========================================

# 检测当前shell类型并设置配置文件路径
detect_shell_config() {
    local shell_type=$(echo $SHELL | awk -F'/' '{print $NF}')

    case $shell_type in
        "bash")
            SHELL_CONFIG_FILE="$HOME/.bashrc"
            ;;
        "zsh")
            SHELL_CONFIG_FILE="$HOME/.zshrc"
            ;;
        "fish")
            SHELL_CONFIG_FILE="$HOME/.config/fish/config.fish"
            ;;
        *)
            # 默认使用bash配置文件
            SHELL_CONFIG_FILE="$HOME/.bashrc"
            echo "警告：检测到不支持的shell ($shell_type)，使用bash配置"
            ;;
    esac

    # 检查配置文件是否存在
    if [ ! -f "$SHELL_CONFIG_FILE" ]; then
        touch "$SHELL_CONFIG_FILE" 2>/dev/null || echo "警告：无法创建配置文件 $SHELL_CONFIG_FILE"
    fi
}

# 定义配置文件路径
CONFIG_FILE="$HOME/.proxy_config"
PATH_CACHE_FILE="$HOME/.proxy_temp_cache"

# 全局变量
SHELL_CONFIG_FILE=""

# 初始化配置文件
init_config() {
    # 检测shell和配置文件
    detect_shell_config

    if [ ! -f "$CONFIG_FILE" ]; then
        touch "$CONFIG_FILE"
    fi

    # 清除临时的缓存文件（如果存在）
    if [ -f "$PATH_CACHE_FILE" ]; then
        rm -f "$PATH_CACHE_FILE" 2>/dev/null
    fi
}

# 显示使用帮助
show_help() {
    echo ""
    echo "📚 使用指南"
    echo "======================"
    echo "🎯 代理类型说明："
    echo "  臨时代理：只在当前终端窗口有效，关闭窗口即失效"
    echo "  永久代理：写入配置文件，重启终端后依然有效"
    echo ""
    echo "💡 输入格式："
    echo "  支持：10.10.10.13:3000 (自动添加http://)"
    echo "  支持：http://10.10.10.13:3000 (完整地址)"
    echo ""
    echo "⚡ 快速操作提示："
    echo "  设置代理后可能需要在新的终端重启生效"
    echo "  使用 'env | grep proxy' 可查看当前代理"
    echo "  使用 'source $SHELL_CONFIG_FILE' 可手动刷新配置"
    echo ""
    echo "🔧 兼容性："
    echo "  当前Shell: $(echo $SHELL | awk -F'/' '{print $NF}')"
    echo "  配置文件: $SHELL_CONFIG_FILE"
    echo "======================"
    echo ""
}

# 设置临时代理（只在当前会话有效）
set_temporary_proxy() {
    echo "请输入临时代理地址（格式：IP:端口或完整URL）"
    echo "例如：127.0.0.1:8080 或 http://127.0.0.1:8080"
    read -r proxy_input

    # 简化输入：自动格式化代理地址
    if [[ $proxy_input =~ ^http(s)?:// ]]; then
        proxy_url="$proxy_input"
    elif [[ $proxy_input =~ ^[^:/]+:[0-9]+$ ]]; then
        proxy_url="http://$proxy_input"
    else
        echo "❌ 无效的代理地址格式，请输入 IP:端口 或完整URL格式。"
        return 1
    fi

    # 设置当前环境变量
    export http_proxy="$proxy_url"
    export https_proxy="$proxy_url"

    echo "✅ 临时代理已设置为：$proxy_url"
    echo "💡 此代理只在当前会话中有效，关闭终端后将失效。"
    return 0
}

# 设置永久代理（写入配置文件，重启终端后依然生效）
set_permanent_proxy() {
    echo "请输入永久代理地址（格式：IP:端口或完整URL）"
    echo "例如：127.0.0.1:8080 或 http://127.0.0.1:8080"
    read -r proxy_input

    # 格式化代理地址
    if [[ $proxy_input =~ ^http(s)?:// ]]; then
        proxy_url="$proxy_input"
    elif [[ $proxy_input =~ ^[^:/]+:[0-9]+$ ]]; then
        proxy_url="http://$proxy_input"
    else
        echo "❌ 无效的代理地址格式，请输入 IP:端口 或完整URL格式。"
        return 1
    fi

    # 保存到配置文件
    echo "$proxy_url" > "$CONFIG_FILE"

    # 设置当前环境变量
    export http_proxy="$proxy_url"
    export https_proxy="$proxy_url"

    # 添加到shell配置文件
    if [ -n "$SHELL_CONFIG_FILE" ] && [ -f "$SHELL_CONFIG_FILE" ]; then
        # 清除旧的代理设置
        sed -i '/export http_proxy=/d' "$SHELL_CONFIG_FILE" 2>/dev/null
        sed -i '/export https_proxy=/d' "$SHELL_CONFIG_FILE" 2>/dev/null

        # 添加新的代理设置
        echo "export http_proxy=\"$proxy_url\"" >> "$SHELL_CONFIG_FILE"
        echo "export https_proxy=\"$proxy_url\"" >> "$SHELL_CONFIG_FILE"

        echo "✅ 永久代理已设置为：$proxy_url"
        echo "💡 请运行 'source $SHELL_CONFIG_FILE' 或重新打开终端以使设置完全生效。"
    else
        echo "✅ 临时代理已设置为：$proxy_url（配置文件未找到）"
    fi
    return 0
}

# 查看代理状态
view_proxy() {
    local has_proxy=0

    echo ""
    echo "=== 代理状态查看 ==="

    # 检查配置文件
    if [ -s "$CONFIG_FILE" ]; then
        local saved_proxy=$(cat "$CONFIG_FILE")
        echo "📄 配置文件代理：$saved_proxy"
        has_proxy=1
    fi

    # 检查当前环境变量
    if [ -n "$http_proxy" ] && [ -n "$https_proxy" ]; then
        echo "⚡ 当前环境代理：$http_proxy"
        has_proxy=1
    fi

    if [ $has_proxy -eq 0 ]; then
        echo "❌ 未设置代理"
    fi

    echo "🔧 Shell类型：$(echo $SHELL | awk -F'/' '{print $NF}')"
    echo "📁 配置文件：$SHELL_CONFIG_FILE"
    echo "=================="
}

# 删除代理设置
delete_proxy() {
    local deleted=0

    # 清除配置文件
    if [ -s "$CONFIG_FILE" ]; then
        > "$CONFIG_FILE"
        echo "✅ 配置文件代理已清除"
        deleted=1
    fi

    # 清除环境变量
    unset http_proxy https_proxy 2>/dev/null
    echo "✅ 环境变量已清除"

    # 清除shell配置文件中的代理设置
    if [ -f "$SHELL_CONFIG_FILE" ]; then
        sed -i '/export http_proxy=/d' "$SHELL_CONFIG_FILE" 2>/dev/null
        sed -i '/export https_proxy=/d' "$SHELL_CONFIG_FILE" 2>/dev/null
        echo "✅ Shell配置文件代理已清除"
        echo "💡 请运行 'source $SHELL_CONFIG_FILE' 或重新打开终端以使更改完全生效"
    fi

    if [ $deleted -eq 0 ]; then
        echo "ℹ️  没有找到代理设置"
    fi
}

# 刷新代理配置（从配置文件重新加载到当前环境）
refresh_proxy_config() {
    echo ""
    echo "🔄 正在刷新代理配置..."

    if [ -s "$CONFIG_FILE" ]; then
        local saved_proxy=$(cat "$CONFIG_FILE")

        # 设置环境变量
        export http_proxy="$saved_proxy"
        export https_proxy="$saved_proxy"

        # 尝试刷新shell配置
        if [ -f "$SHELL_CONFIG_FILE" ] && source "$SHELL_CONFIG_FILE" 2>/dev/null; then
            echo "✅ 代理配置已刷新！"
            echo "📄 当前代理：$saved_proxy"

            # 显示当前环境变量确认
            echo "🌐 验证环境变量："
            echo "   http_proxy=$http_proxy"
            echo "   https_proxy=$https_proxy"
        else
            echo "✅ 环境变量已设置，但shell配置刷新失败"
            echo "📄 当前代理：$saved_proxy"
            echo "💡 请手动运行：source $SHELL_CONFIG_FILE"
        fi
    else
        echo "❌ 未找到保存的代理配置，请先设置永久代理"
        return 1
    fi

    return 0
}

# 测试代理连通性
test_proxy_connection() {
    local test_url="http://httpbin.org/ip"
    local proxy_to_test=""

    # 优先使用环境变量中的代理
    if [ -n "$http_proxy" ]; then
        proxy_to_test="$http_proxy"
    elif [ -s "$CONFIG_FILE" ]; then
        proxy_to_test=$(cat "$CONFIG_FILE")
    fi

    if [ -z "$proxy_to_test" ]; then
        echo "❌ 未找到代理设置，请先设置代理"
        return 1
    fi

    echo "🌐 正在测试代理连接：$proxy_to_test"
    echo "📊 测试URL：$test_url"

    # 使用curl测试连接
    local response=$(curl --connect-timeout 10 --max-time 30 --proxy "$proxy_to_test" -s "$test_url" 2>&1)

    if [ $? -eq 0 ] && [ -n "$response" ]; then
        # 尝试提取IP地址信息
        local origin_ip=$(echo "$response" | grep -o '"origin":"[^"]*"' | cut -d'"' -f4 2>/dev/null)
        echo "✅ 代理连接成功！"
        if [ -n "$origin_ip" ]; then
            echo "🖥️  出口IP：$origin_ip"
        fi
        return 0
    else
        echo "❌ 代理连接失败：$response"
        return 1
    fi
}

# 显示菜单
show_menu() {
    echo ""
    echo "🌟 ===== 通用代理管理工具 ====="
    echo "           支持所有Linux发行版"
    echo ""
    echo "🚪 0. 退出程序"
    echo "⚡ 1. 设置临时代理（仅当前会话）"
    echo "💾 2. 设置永久代理（重启后依然生效）"
    echo "👀 3. 查看代理状态"
    echo "🗑️  4. 删除所有代理设置"
    echo "🔄 5. 刷新代理配置"
    echo "🩺 6. 测试代理连通性"
    echo "📚 7. 显示使用帮助"
    echo ""
    echo "📋 请输入对应的数字 (0-7): "
    read -r choice

    case $choice in
        0) echo "👋 感谢使用代理管理工具！"; exit 0 ;;
        1) set_temporary_proxy ;;
        2) set_permanent_proxy ;;
        3) view_proxy ;;
        4) delete_proxy ;;
        5) refresh_proxy_config ;;
        6) test_proxy_connection ;;
        7) show_help ;;
        *) echo "❌ 无效选项 '$choice'，请重新选择。" ;;
    esac

    # 操作完成后提示继续
    if [ "$choice" != "0" ]; then
        echo ""
        echo "⏎ 按回车键继续..."
        read -r dummy
    fi
}

# 主程序
main() {
    # 初始化配置
    init_config

    # 显示欢迎消息
    echo ""
    echo "🚀 欢迎使用通用代理管理工具！"
    echo "====================================="
    echo "🎯 支持功能："
    echo "   • 临时代理设置（当前会话有效）"
    echo "   • 永久代理设置（重启终端后依然有效）"
    echo "   • 代理状态查看与测试"
    echo "====================================="
    echo "🔧 当前环境："
    echo "   Shell: $(echo $SHELL | awk -F'/' '{print $NF}')"
    echo "   配置文件: $SHELL_CONFIG_FILE"
    echo ""
    echo "💡 使用选项7查看详细帮助"
    echo ""

    # 主循环
    while true; do
        show_menu
    done
}

# 执行主程序
main