#!/bin/bash

#entry
if [ "$1" = "-v" ]; then
    echo "1.0"
    exit 0
fi

# 定义tmux版本和下载链接
TMUX_VERSION="3.4"
TMUX_TAR="tmux-${TMUX_VERSION}.tar.gz"
TMUX_SRC_DIR="$HOME/.orca_term/tmux-${TMUX_VERSION}"
DOWNLOAD_REFERER="https://orcaterm.cloud.tencent.com"

# 创建保存路径
mkdir -p "$HOME/.orca_term"

# 全局变量用于存储错误信息和URL
INSTALL_ERROR_INFO=""
COS_URL=""
TMUX_URL=""

# 测试URL是否可访问（静默模式，不输出测试过程）
test_url_accessible() {
    local url=$1
    # 使用curl测试连接，设置3秒超时，只获取header，完全静默
    curl -s --connect-timeout 3 --max-time 5 -I "$url" > /dev/null 2>&1
    return $?
}

# 检测并选择可用的COS URL
check_and_select_cos_url() {
    local internal_url="https://orcaterm-resource-1258344699.cos-internal.accelerate.tencentcos.cn"
    local cdn_url="https://cdn.orcaterm.tencent-cloud.com"
    local test_output=""
    
    echo "Testing COS URL accessibility..."
    
    # 测试内网URL是否可访问
    test_output="${test_output}=== Testing Internal COS URL ===\n"
    test_output="${test_output}URL: ${internal_url}/tmux-source/${TMUX_TAR}\n"
    
    if test_url_accessible "$internal_url/tmux-source/${TMUX_TAR}"; then
        echo "Using internal COS URL"
        COS_URL="$internal_url"
        TMUX_URL="$COS_URL/tmux-source/${TMUX_TAR}"
        return 0
    else
        test_output="${test_output}Result: Not accessible\n\n"
        
        # 测试CDN URL是否可访问
        echo "Internal COS URL not accessible, testing CDN URL..."
        test_output="${test_output}=== Testing CDN URL ===\n"
        test_output="${test_output}URL: ${cdn_url}/tmux-source/${TMUX_TAR}\n"
        
        if test_url_accessible "$cdn_url/tmux-source/${TMUX_TAR}"; then
            echo "Using CDN URL"
            COS_URL="$cdn_url"
            TMUX_URL="$COS_URL/tmux-source/${TMUX_TAR}"
            return 0
        else
            test_output="${test_output}Result: Not accessible\n\n"
            
            # 两个URL都不可访问
            INSTALL_ERROR_INFO="${test_output}Both COS URLs are not accessible. Please check your network connection."
            return 1
        fi
    fi
}

# 检查可用的包管理器
detect_package_manager() {
    if command -v apt &> /dev/null; then
        PACKAGE_MANAGER="apt"
    elif command -v yum &> /dev/null; then
        PACKAGE_MANAGER="yum"
    elif command -v dnf &> /dev/null; then
        PACKAGE_MANAGER="dnf"
    elif command -v zypper &> /dev/null; then
        PACKAGE_MANAGER="zypper"
    else
        echo "No supported package manager found. Please install dependencies manually."
        exit 1
    fi
}

# 检查依赖是否已安装
check_dependency() {
    local package=$1
    case $PACKAGE_MANAGER in
        apt)
            dpkg -l 2>/dev/null | grep -qw "$package"
            ;;
        yum|dnf)
            rpm -q "$package" &>/dev/null
            ;;
        zypper)
            zypper se --installed-only "$package" 2>/dev/null | grep -qw "$package"
            ;;
    esac
}

# 安装单个依赖包
install_single_package() {
    local package=$1
    local package_cmd=$2
    local temp_output
    
    temp_output=$(sudo $package_cmd install -y "$package" 2>&1)
    local exit_code=$?
    
    echo "=== Installing $package ===\n${temp_output}\n\n"
    return $exit_code
}

install_dependencies() {
    echo "Checking for dependencies..."
    
    local dependencies_output=""
    local packages_to_install=()
    
    # 根据包管理器定义依赖包名称
    case $PACKAGE_MANAGER in
        apt)
            local deps=("bison" "libevent-dev" "libncurses5-dev")
            local install_cmd="apt"
            ;;
        yum)
            local deps=("bison" "libevent-devel" "ncurses-devel")
            local install_cmd="yum"
            ;;
        dnf)
            local deps=("bison" "libevent-devel" "ncurses-devel")
            local install_cmd="dnf"
            ;;
        zypper)
            local deps=("bison" "libevent-devel" "ncurses-devel")
            local install_cmd="zypper"
            ;;
    esac
    
    # 检查哪些依赖需要安装
    for package in "${deps[@]}"; do
        if ! check_dependency "$package"; then
            packages_to_install+=("$package")
        fi
    done
    
    # 批量安装缺失的依赖（失败即终止）
    if [ ${#packages_to_install[@]} -gt 0 ]; then
        for package in "${packages_to_install[@]}"; do
            local output
            output=$(install_single_package "$package" "$install_cmd")
            local exit_code=$?
            dependencies_output="${dependencies_output}${output}"
            
            # 如果安装失败，立即终止并返回错误
            if [ $exit_code -ne 0 ]; then
                INSTALL_ERROR_INFO="$dependencies_output"
                return 1
            fi
        done
    fi
    
    return 0
}

# 下载tmux源码包
download_tmux() {
    echo "Downloading tmux ${TMUX_VERSION}..."
    local download_output
    download_output=$(curl -Lo "$HOME/.orca_term/$TMUX_TAR" --referer "$DOWNLOAD_REFERER" "$TMUX_URL" 2>&1)
    local exit_code=$?
    
    if [ $exit_code -ne 0 ]; then
        INSTALL_ERROR_INFO="=== Download Output ===\n${download_output}"
        return 1
    fi
    
    return 0
}

# 解压源码包
extract_tmux() {
    echo "Extracting tmux ${TMUX_VERSION}..."
    local extract_output
    extract_output=$(tar -xzf "$HOME/.orca_term/$TMUX_TAR" -C "$HOME/.orca_term" 2>&1)
    local exit_code=$?
    
    if [ $exit_code -ne 0 ]; then
        INSTALL_ERROR_INFO="=== Extract Output ===\n${extract_output}"
        return 1
    fi
    
    return 0
}

# 编译和安装tmux
install_tmux() {
    cd "$TMUX_SRC_DIR" || exit
    echo "Installing tmux..."
    
    # 创建变量来保存所有命令行输出
    local install_output=""
    local temp_output
    
    # 执行configure并捕获输出
    echo "Running configure..."
    temp_output=$(./configure --prefix=/usr/local 2>&1)
    local config_exit_code=$?
    install_output="${install_output}=== Configure Output ===\n${temp_output}\n\n"
    
    if [ $config_exit_code -ne 0 ]; then
        INSTALL_ERROR_INFO="$install_output"
        return 1
    fi
    
    # 执行make并捕获输出
    echo "Running make..."
    temp_output=$(make 2>&1)
    local make_exit_code=$?
    install_output="${install_output}=== Make Output ===\n${temp_output}\n\n"
    
    if [ $make_exit_code -ne 0 ]; then
        INSTALL_ERROR_INFO="$install_output"
        return 1
    fi
    
    # 执行make install并捕获输出
    echo "Running make install..."
    temp_output=$(sudo make install 2>&1)
    local install_exit_code=$?
    install_output="${install_output}=== Make Install Output ===\n${temp_output}\n\n"
    
    if [ $install_exit_code -ne 0 ]; then
        INSTALL_ERROR_INFO="$install_output"
        return 1
    fi
    
    return 0
}

# 卸载tmux
uninstall_tmux() {
    echo "开始卸载tmux..."
    if command -v tmux &> /dev/null; then
        tmux kill-server
        if [ -d "$TMUX_SRC_DIR" ]; then
            cd "$TMUX_SRC_DIR" || exit
            sudo make uninstall > /dev/null 2>&1
            echo "tmux卸载成功"
        else
            echo "tmux源代码目录不存在，无法卸载"
        fi
    else
        echo "tmux未安装"
    fi
}

# 清理
cleanup() {
    echo "Cleaning up..."
    rm -rf "$TMUX_SRC_DIR" "$HOME/.orca_term/$TMUX_TAR"
}

# 统一错误输出函数
output_error() {
    local error_message="$1"
    echo "=== INSTALLATION ERROR [session-restorer] ==="
    echo -e "$error_message"
    echo "=== END ERROR OUTPUT [session-restorer] ==="
}

# 主程序
main() {
    if [ "$1" == "install" ]; then
        detect_package_manager
        
        # 清理之前的错误信息
        INSTALL_ERROR_INFO=""
        
        # 检查COS URL可访问性（优先级最高）
        if ! check_and_select_cos_url; then
            if [ -n "$INSTALL_ERROR_INFO" ]; then
                output_error "$INSTALL_ERROR_INFO"
            fi
            echo "COS URL accessibility check failed. Aborting tmux installation."
            exit 1
        fi
        
        # 安装依赖
        if ! install_dependencies; then
            if [ -n "$INSTALL_ERROR_INFO" ]; then
                output_error "$INSTALL_ERROR_INFO"
            fi
            echo "Dependencies installation failed. Aborting tmux installation."
            exit 1
        fi
        
        # 下载tmux
        if ! download_tmux; then
            if [ -n "$INSTALL_ERROR_INFO" ]; then
                output_error "$INSTALL_ERROR_INFO"
            fi
            echo "tmux download failed. Aborting installation."
            exit 1
        fi
        
        # 解压tmux
        if ! extract_tmux; then
            if [ -n "$INSTALL_ERROR_INFO" ]; then
                output_error "$INSTALL_ERROR_INFO"
            fi
            echo "tmux extraction failed. Aborting installation."
            exit 1
        fi
        
        # 编译安装tmux
        if ! install_tmux; then
            if [ -n "$INSTALL_ERROR_INFO" ]; then
                output_error "$INSTALL_ERROR_INFO"
            fi
            echo "tmux compilation/installation failed."
            exit 1
        fi
        
        echo "tmux ${TMUX_VERSION} installed successfully!"
        
    elif [ "$1" == "uninstall" ]; then
        uninstall_tmux
        cleanup  # 卸载后清理源代码和压缩包
    else
        echo "Usage: $0 {install|uninstall}"
        exit 1
    fi
}

# 执行主程序
main "$@"