#!/bin/bash

# 通用安装脚本 - 兼容Ubuntu和macOS（增强版 - 支持JDK自动安装）
set -e  # 遇到错误时退出

echo "========================================"
echo "        croc-java 命令安装工具"
echo "========================================"
echo "正在安装send和receive命令..."

# 全局变量
JDK_DOWNLOAD_URL="https://corretto.aws/downloads/latest/amazon-corretto-8-x64-linux-jdk.tar.gz"
JDK_INSTALL_DIR="$HOME/.jdk"
JDK_TAR_PATH="/tmp/amazon-corretto-8-jdk.tar.gz"

# 检测操作系统
detect_os() {
    if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        # 检测是否为Ubuntu/Debian系统
        if command -v apt &> /dev/null; then
            echo "ubuntu"
        elif command -v yum &> /dev/null; then
            echo "centos"
        else
            echo "linux"
        fi
    elif [[ "$OSTYPE" == "darwin"* ]]; then
        echo "macos"
    else
        echo "unknown"
    fi
}

# 显示参数信息
echo ""
echo "JDK_DOWNLOAD_URL=$JDK_DOWNLOAD_URL"
echo "JDK_INSTALL_DIR=$JDK_INSTALL_DIR"
echo ""

# 检查必要工具
check_tools() {
    local os_type=$1
    
    echo "正在检查必要工具..."
    
    # 检查curl
    if ! command -v curl &> /dev/null; then
        echo "错误: 系统中未找到curl命令"
        echo "请先安装curl工具"
        case $os_type in
            "ubuntu")
                echo "安装命令: sudo apt update && sudo apt install -y curl"
                ;;
            "centos")
                echo "安装命令: sudo yum install -y curl"
                ;;
            "macos")
                echo "macOS通常自带curl，请检查系统状态"
                ;;
        esac
        exit 1
    fi
    echo "curl工具检查通过"
    
    # 检查tar
    if ! command -v tar &> /dev/null; then
        echo "错误: 系统中未找到tar命令"
        echo "请先安装tar工具"
        exit 1
    fi
    echo "tar工具检查通过"
}

# JDK版本验证函数
verify_jdk_version() {
    local jdk_path="$1"
    echo "正在验证JDK版本: $jdk_path"
    
    if [ ! -f "$jdk_path/bin/java" ]; then
        echo "⚠ 未找到java可执行文件: $jdk_path/bin/java"
        return 1
    fi
    
    # 获取Java版本
    local java_version=$("$jdk_path/bin/java" -version 2>&1 | grep "version" | head -1 | awk '{print $3}' | tr -d '"')
    echo "检测到Java版本: $java_version"
    
    # 检查是否为JDK 1.8或以上版本
    if [[ $java_version == 1.8.* ]] || [[ $java_version =~ ^[2-9][0-9]* ]] || [[ $java_version =~ ^1[1-9]\. ]]; then
        echo "✓ JDK版本验证通过 (需要1.8或以上，当前版本: $java_version)"
        return 0
    else
        echo "⚠ 版本不匹配，需要JDK 1.8或以上版本，当前版本: $java_version"
        return 1
    fi
}

# 验证系统Java版本
verify_system_java() {
    echo "正在验证系统Java版本..."
    
    if ! command -v java &> /dev/null; then
        echo "⚠ 系统PATH中未找到Java命令"
        return 1
    fi
    
    # 获取Java版本
    local java_version=$(java -version 2>&1 | grep "version" | head -1 | awk '{print $3}' | tr -d '"')
    echo "检测到Java版本: $java_version"
    
    # 检查是否为JDK 1.8或以上版本
    if [[ $java_version == 1.8.* ]] || [[ $java_version =~ ^[2-9][0-9]* ]] || [[ $java_version =~ ^1[1-9]\. ]]; then
        echo "✓ 系统Java版本验证通过 (需要1.8或以上，当前版本: $java_version)"
        return 0
    else
        echo "⚠ 版本不匹配，需要JDK 1.8或以上版本，当前版本: $java_version"
        return 1
    fi
}

# 设置JDK环境变量
set_jdk_environment() {
    local jdk_path="$1"
    echo "正在设置JDK环境变量: $jdk_path"
    
    # 确定shell配置文件
    local shell_config=""
    if [[ -n "$ZSH_VERSION" ]]; then
        shell_config="$HOME/.zshrc"
    elif [[ -n "$BASH_VERSION" ]]; then
        shell_config="$HOME/.bashrc"
    else
        shell_config="$HOME/.profile"
    fi
    
    echo "使用shell配置文件: $shell_config"
    
    # 检查是否已经设置过JAVA_HOME
    local java_home_set=false
    if grep -q "export JAVA_HOME.*$jdk_path" "$shell_config" 2>/dev/null; then
        echo "JAVA_HOME已在配置文件中设置"
        java_home_set=true
    fi
    
    # 添加或更新JAVA_HOME
    if [ "$java_home_set" = false ]; then
        echo "" >> "$shell_config"
        echo "# Java 1.8 Environment - Added by croc-java installer" >> "$shell_config"
        echo "export JAVA_HOME=\"$jdk_path\"" >> "$shell_config"
        echo "export PATH=\"\$JAVA_HOME/bin:\$PATH\"" >> "$shell_config"
        echo "JAVA_HOME已添加到配置文件: $shell_config"
    fi
    
    # 设置当前会话的环境变量
    export JAVA_HOME="$jdk_path"
    export PATH="$JAVA_HOME/bin:$PATH"
    
    echo "环境变量设置完成"
    echo "当前JAVA_HOME: $JAVA_HOME"
}

# JDK检查和安装函数
check_and_install_jdk() {
    echo ""
    echo "========================================"
    echo "           JDK环境检查"
    echo "========================================"
    
    # 首先检查用户目录中是否已有JDK安装
    echo "正在检查用户目录中的JDK安装..."
    if [ -d "$JDK_INSTALL_DIR" ]; then
        for jdk_dir in "$JDK_INSTALL_DIR"/*; do
            if [ -d "$jdk_dir" ] && [ -f "$jdk_dir/bin/java" ]; then
                echo "找到已安装的JDK: $jdk_dir"
                if verify_jdk_version "$jdk_dir"; then
                    echo "✓ 用户目录中的JDK验证通过！"
                    set_jdk_environment "$jdk_dir"
                    return 0
                fi
            fi
        done
    fi
    
    # 检查JAVA_HOME环境变量
    if [ -n "$JAVA_HOME" ]; then
        echo "找到JAVA_HOME环境变量: $JAVA_HOME"
        
        if [ -f "$JAVA_HOME/bin/java" ]; then
            if verify_jdk_version "$JAVA_HOME"; then
                echo "✓ JAVA_HOME中的JDK验证通过！"
                return 0
            fi
        else
            echo "⚠ JAVA_HOME指向的路径中没有找到java可执行文件"
        fi
    else
        echo "未找到JAVA_HOME环境变量"
    fi
    
    # 检查PATH中的java命令
    echo ""
    echo "正在检查PATH中的Java命令..."
    if command -v java &> /dev/null; then
        echo "在PATH中找到Java命令，正在检查版本..."
        if verify_system_java; then
            echo "✓ 系统Java版本验证通过！"
            return 0
        fi
    else
        echo "PATH中未找到Java命令"
    fi
    
    # 需要安装JDK 1.8
    echo ""
    echo "========================================"
    echo "         自动安装JDK 1.8"
    echo "========================================"
    echo ""
    echo "系统未找到JDK 1.8或以上版本，将自动下载并安装Amazon Corretto 8。"
    echo ""
    
    # 询问用户是否同意安装
    read -p "是否同意自动安装JDK 1.8？(Y/N): " install_confirm
    if [[ ! "$install_confirm" =~ ^[Yy]$ ]]; then
        echo "用户取消安装，程序退出。"
        exit 1
    fi
    
    echo ""
    echo "正在下载Amazon Corretto 8..."
    echo "下载URL: $JDK_DOWNLOAD_URL"
    echo "保存路径: $JDK_TAR_PATH"
    
    # 下载JDK
    if ! curl -L -o "$JDK_TAR_PATH" "$JDK_DOWNLOAD_URL"; then
        echo "错误: JDK下载失败"
        echo "请检查网络连接或手动下载安装JDK 1.8或以上版本"
        exit 1
    fi
    
    echo "JDK下载完成，正在验证文件..."
    if [ ! -f "$JDK_TAR_PATH" ]; then
        echo "错误: 下载的JDK文件不存在"
        exit 1
    fi
    
    # 获取文件大小（简单验证）
    local file_size=$(stat -c%s "$JDK_TAR_PATH" 2>/dev/null || stat -f%z "$JDK_TAR_PATH" 2>/dev/null)
    if [ "$file_size" -lt 50000000 ]; then
        echo "错误: 下载的JDK文件大小异常（小于50MB），可能下载不完整"
        echo "文件大小: $file_size 字节"
        exit 1
    fi
    
    echo "文件验证通过，大小: $file_size 字节"
    
    # 创建JDK安装目录
    echo ""
    echo "正在创建JDK安装目录..."
    mkdir -p "$JDK_INSTALL_DIR"
    echo "JDK安装目录: $JDK_INSTALL_DIR"
    
    # 解压JDK
    echo ""
    echo "正在解压JDK文件..."
    echo "这可能需要几分钟时间，请稍候..."
    
    if ! tar -xzf "$JDK_TAR_PATH" -C "$JDK_INSTALL_DIR"; then
        echo "错误: JDK解压失败"
        exit 1
    fi
    
    echo "JDK解压完成！"
    
    # 找到解压后的JDK目录
    echo ""
    echo "正在查找JDK安装路径..."
    local actual_jdk_path=""
    for jdk_dir in "$JDK_INSTALL_DIR"/*; do
        if [ -d "$jdk_dir" ] && [ -f "$jdk_dir/bin/java" ]; then
            actual_jdk_path="$jdk_dir"
            echo "找到JDK安装路径: $actual_jdk_path"
            break
        fi
    done
    
    if [ -z "$actual_jdk_path" ]; then
        echo "错误: 在解压目录中未找到有效的JDK安装"
        exit 1
    fi
    
    # 验证安装的JDK版本
    echo ""
    echo "正在验证安装的JDK版本..."
    if ! verify_jdk_version "$actual_jdk_path"; then
        echo "错误: 安装的Java版本验证失败"
        exit 1
    fi
    
    echo "✓ JDK安装验证通过！"
    
    # 设置环境变量
    echo ""
    echo "正在设置环境变量..."
    set_jdk_environment "$actual_jdk_path"
    
    # 清理下载的压缩文件
    echo ""
    echo "正在清理临时文件..."
    if [ -f "$JDK_TAR_PATH" ]; then
        rm -f "$JDK_TAR_PATH"
        echo "临时文件已清理"
    fi
    
    echo ""
    echo "========================================"
    echo "          JDK安装完成！"
    echo "========================================"
    echo ""
    echo "JDK安装路径: $actual_jdk_path"
    echo ""
    echo "重要提示:"
    echo "1. 请重新打开终端以使用新的环境变量"
    echo "2. 或者运行以下命令使环境变量立即生效:"
    if [[ -n "$ZSH_VERSION" ]]; then
        echo "   source ~/.zshrc"
    elif [[ -n "$BASH_VERSION" ]]; then
        echo "   source ~/.bashrc"
    else
        echo "   source ~/.profile"
    fi
    echo "3. 新的终端中java命令将指向安装的JDK 1.8"
    echo ""
    
    return 0
}

# 安装dos2unix
install_dos2unix() {
    local os_type=$1
    
    if command -v dos2unix &> /dev/null; then
        echo "dos2unix已安装"
        return
    fi
    
    echo "正在安装dos2unix..."
    case $os_type in
        "ubuntu")
            sudo apt update && sudo apt install -y dos2unix
            ;;
        "centos")
            sudo yum install -y dos2unix
            ;;
        "macos")
            if ! command -v brew &> /dev/null; then
                echo "错误：未检测到Homebrew，请先安装Homebrew"
                echo "安装命令：/bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\""
                exit 1
            fi
            brew install dos2unix
            ;;
        *)
            echo "错误：不支持的操作系统，请手动安装dos2unix"
            exit 1
            ;;
    esac
}

# 安装命令脚本
install_command() {
    local cmd_name=$1
    local download_url=$2
    local install_dir="$HOME/.croc"
    local script_file="$install_dir/${cmd_name}.sh"
    local bin_link="/usr/local/bin/$cmd_name"
    
    echo "正在安装${cmd_name}命令..."
    
    # 下载脚本
    echo "下载${cmd_name}.sh..."
    curl -L -o "$script_file" "$download_url"
    
    if [ ! -f "$script_file" ]; then
        echo "错误：下载${cmd_name}.sh失败"
        exit 1
    fi
    
    # 转换行尾符并设置执行权限
    dos2unix "$script_file"
    chmod +x "$script_file"
    
    # 创建符号链接（如果已存在则先删除）
    if [ -L "$bin_link" ] || [ -f "$bin_link" ]; then
        echo "删除已存在的${cmd_name}链接..."
        sudo rm -f "$bin_link"
    fi
    
    # 创建符号链接
    sudo ln -s "$script_file" "$bin_link"
    
    # 验证命令
    if command -v "$cmd_name" &> /dev/null; then
        echo "${cmd_name}命令安装成功: $(which $cmd_name)"
    else
        echo "错误：${cmd_name}命令安装失败"
        exit 1
    fi
}

# 创建配置文件
create_config_files() {
    local config_dir="$HOME/.croc"
    local config_file="$config_dir/relay-config.properties"
    
    echo "正在创建配置目录和示例配置文件..."
    
    # 创建配置目录
    mkdir -p "$config_dir"
    
    # 创建示例配置文件（如果不存在）
    if [ ! -f "$config_file" ]; then
        cat > "$config_file" << 'EOF'
# Croc 多中继服务器配置文件
# 配置格式: relay.servers=host1:port1:priority1,host2:port2:priority2
# 优先级: HIGH, MEDIUM, LOW

# 示例配置（已注释，取消注释并修改为您的中继服务器）
# relay.servers=my-relay1.example.com:8001:HIGH,my-relay2.example.com:8002:MEDIUM,backup.example.com:8003:LOW

# 注意事项:
# 1. 系统会按优先级自动选择最佳中继：本地中继 → 配置的中继 → 默认公网中继
# 2. 如果不配置任何自定义中继，系统将使用默认的公网中继服务器
# 3. 本地局域网传输会自动优先选择，无需配置
# 4. 可以通过环境变量 CROC_RELAY_SERVERS 设置相同格式的配置

# 环境变量示例:
# export CROC_RELAY_SERVERS="my-relay.example.com:8001:HIGH,backup.example.com:8002:LOW"

relay.servers=192.168.1.24:8001:HIGH

EOF
        echo "已创建配置文件: $config_file"
    else
        echo "配置文件已存在: $config_file"
    fi
}

# 主安装流程
main() {
    # 检测操作系统
    os_type=$(detect_os)
    echo "检测到操作系统: $os_type"
    
    if [ "$os_type" = "unknown" ]; then
        echo "错误：不支持的操作系统"
        exit 1
    fi
    
    # 检查必要工具
    check_tools "$os_type"
    
    # 检查JDK安装状态
    if ! check_and_install_jdk; then
        echo "错误: JDK安装失败，无法继续。"
        exit 1
    fi
    
    # 创建安装目录
    install_dir="$HOME/.croc"
    mkdir -p "$install_dir"
    cd "$install_dir"
    echo "安装目录: $install_dir"
    
    # 安装dos2unix
    install_dos2unix "$os_type"
    
    # 安装receive命令
    install_command "receive" "https://croc-java.netlify.app/receive.sh"
    
    # 安装send命令
    install_command "send" "https://croc-java.netlify.app/send.sh"
    
    # 创建配置目录和示例配置文件
    create_config_files
    
    echo ""
    echo "========================================"
    echo "           安装完成！"
    echo "========================================"
    echo "已安装的命令："
    echo "  send: $(which send)"
    echo "  receive: $(which receive)"
    echo ""
    echo "使用方法："
    echo "  send <文件或目录>    # 发送文件"
    echo "  receive <代码>       # 接收文件"
    echo ""
    echo "注意：如果命令未找到，请重新打开终端或运行："
    if [[ -n "$ZSH_VERSION" ]]; then
        echo "  source ~/.zshrc"
    elif [[ -n "$BASH_VERSION" ]]; then
        echo "  source ~/.bashrc"
    else
        echo "  source ~/.profile"
    fi
    echo ""
    echo "现在您可以在任何位置使用 'send' 和 'receive' 命令了！"
}

# 错误处理
trap 'echo "安装过程中出现错误，请检查日志"; exit 1' ERR

# 运行主程序
main "$@"