#!/bin/bash
set -eu

# CodeBuddy 安装和启动脚本
# 基于 Node.js 20+ 的 CodeBuddy 包管理器

# 定义常量和配置
ORCA_CODEBUDDY_DIR="$HOME/.orca_term/codebuddy"
NODEJS_MIN_VERSION="18"
NODEJS_INSTALL_VERSION="18.20.8"
CODEBUDDY_PACKAGE="@tencent-ai/codebuddy-code"

# 状态码定义
STATUS_SUCCESS=0
STATUS_ERROR=1
STATUS_NOT_INSTALLED=2
STATUS_NODE_VERSION_LOW=3

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检测系统架构
get_arch() {
    case $(uname -m) in
        x86_64) echo "x64" ;;
        aarch64|arm64) echo "arm64" ;;
        armv7l) echo "armv7l" ;;
        *) echo "unknown" ;;
    esac
}

# 检测操作系统
get_os() {
    case $(uname -s) in
        Linux) echo "linux" ;;
        Darwin) echo "darwin" ;;
        *) echo "unknown" ;;
    esac
}

# 检查 Node.js 版本
check_node_version() {
    if command -v node >/dev/null 2>&1; then
        local node_version=$(node --version | sed 's/v//')
        local major_version=$(echo "$node_version" | cut -d. -f1)
        
        log_info "系统默认 Node.js 版本: $node_version"
        
        if [ "$major_version" -ge "$NODEJS_MIN_VERSION" ]; then
            log_success "系统默认 Node.js 版本满足要求 (>= $NODEJS_MIN_VERSION)"
            return $STATUS_SUCCESS
        else
            log_warning "系统默认 Node.js 版本过低 ($node_version < $NODEJS_MIN_VERSION)"
            log_info "将安装独立版本的 Node.js $NODEJS_INSTALL_VERSION 用于 CodeBuddy"
            return $STATUS_NODE_VERSION_LOW
        fi
    else
        log_warning "未检测到系统默认 Node.js"
        log_info "将安装独立版本的 Node.js $NODEJS_INSTALL_VERSION 用于 CodeBuddy"
        return $STATUS_NOT_INSTALLED
    fi
}


# 下载并安装指定版本的 Node.js
install_nodejs() {
    local version="$1"
    local os=$(get_os)
    local arch=$(get_arch)
    
    if [ "$os" = "unknown" ] || [ "$arch" = "unknown" ]; then
        log_error "不支持的系统架构"
        return $STATUS_ERROR
    fi
    
    local node_dir="$ORCA_CODEBUDDY_DIR/nodejs"
    local node_bin="$node_dir/bin/node"
    local npm_bin="$node_dir/bin/npm"
    
# 如果已经安装了该版本，直接返回
    if [ -f "$node_bin" ] && [ -f "$npm_bin" ]; then
        log_success "独立 Node.js $version 已安装"
        return $STATUS_SUCCESS
    fi
    
    log_info "开始安装独立版本的 Node.js $version (不影响系统默认版本)..."
    
    # 创建目录
    mkdir -p "$ORCA_CODEBUDDY_DIR"
    
    # 下载 Node.js 二进制包
    local download_url="https://nodejs.org/dist/v$version/node-v$version-$os-$arch.tar.gz"
    local temp_file="$ORCA_CODEBUDDY_DIR/nodejs-temp.tar.gz"
    
    if ! curl --connect-timeout 30 -fsSL "$download_url" -o "$temp_file"; then
        log_error "下载 Node.js 失败，URL: $download_url"
        return $STATUS_ERROR
    fi
    
    # 解压
    log_info "解压 Node.js 到独立目录..."
    if ! tar -xzf "$temp_file" -C "$ORCA_CODEBUDDY_DIR"; then
        log_error "解压 Node.js 失败"
        rm -f "$temp_file"
        return $STATUS_ERROR
    fi
    
    # 重命名目录
    local extracted_dir="$ORCA_CODEBUDDY_DIR/node-v$version-$os-$arch"
    if [ -d "$extracted_dir" ]; then
        mv "$extracted_dir" "$node_dir"
    else
        log_error "解压后目录不存在: $extracted_dir"
        rm -f "$temp_file"
        return $STATUS_ERROR
    fi
    
    # 清理临时文件
    rm -f "$temp_file"
    
# 验证安装
    if [ -f "$node_bin" ] && [ -f "$npm_bin" ]; then
        local installed_version=$("$node_bin" --version | sed 's/v//')
        log_success "独立 Node.js $installed_version 安装成功"
        log_info "安装路径: $node_dir"
        return $STATUS_SUCCESS
    else
        log_error "Node.js 安装验证失败"
        return $STATUS_ERROR
    fi
}

# 获取 CodeBuddy 可执行文件路径
get_codebuddy_executable() {
    # 首先检查全局安装
    if command -v codebuddy > /dev/null 2>&1; then
        echo "codebuddy"
        return $STATUS_SUCCESS
    fi
    
    # 检查本地安装
    if [ -f "$ORCA_CODEBUDDY_DIR/node_modules/.bin/codebuddy" ]; then
        echo "$ORCA_CODEBUDDY_DIR/node_modules/.bin/codebuddy"
        return $STATUS_SUCCESS
    fi
    
    return $STATUS_NOT_INSTALLED
}

# 检查 CodeBuddy 是否已安装
check_codebuddy() {
    # 首先检查全局安装
    if command -v codebuddy > /dev/null 2>&1; then
        log_success "检测到全局安装的 CodeBuddy"
        return $STATUS_SUCCESS
    fi
    
    # 检查本地安装
    if [ -d "$ORCA_CODEBUDDY_DIR/node_modules" ] && [ -f "$ORCA_CODEBUDDY_DIR/node_modules/.bin/codebuddy" ]; then
        log_success "检测到本地安装的 CodeBuddy"
        return $STATUS_SUCCESS
    fi
    
    return $STATUS_NOT_INSTALLED
}

# 安装 CodeBuddy
install_codebuddy() {
    log_info "开始安装 CodeBuddy..."
    
    # 检查是否为系统 Node.js（版本 >= 20）
    if check_node_version; then
        log_info "系统 Node.js 版本满足要求 (>= $NODEJS_MIN_VERSION)，使用全局安装"
        
        # 使用 npm 全局安装
        if npm install -g "$CODEBUDDY_PACKAGE"; then
            log_success "CodeBuddy 全局安装成功"
            return $STATUS_SUCCESS
        else
            log_error "CodeBuddy 全局安装失败"
            return $STATUS_ERROR
        fi
    else
        log_info "系统 Node.js 版本不满足要求，需要使用独立 Node.js 环境"
        
        # 先安装独立 Node.js
        if ! install_nodejs "$NODEJS_INSTALL_VERSION"; then
            log_error "独立 Node.js 安装失败"
            return $STATUS_ERROR
        fi
        
        log_info "使用独立 Node.js 环境，进行本地安装"
        
        # 获取独立Node.js路径
        local os=$(get_os)
        local arch=$(get_arch)
        local node_dir="$ORCA_CODEBUDDY_DIR/nodejs"
        local node_bin="$node_dir/bin/node"
        local npm_bin="$node_dir/bin/npm"
        
        # 创建本地安装目录
        mkdir -p "$ORCA_CODEBUDDY_DIR"
        
        # 切换到安装目录
        cd "$ORCA_CODEBUDDY_DIR"
        
# 使用独立 Node.js 直接执行 npm 脚本来安装 CodeBuddy
        if "$node_bin" "$npm_bin" install "$CODEBUDDY_PACKAGE"; then
            log_success "CodeBuddy 本地安装成功"
            return $STATUS_SUCCESS
        else
            log_error "CodeBuddy 本地安装失败"
            return $STATUS_ERROR
        fi
    fi
}

# 主函数
main() {
    local action="${1:-start}"
    
    case "$action" in
        -v|--version)
            echo "1.0"
            exit 0
            ;;
        install)
            log_info "CodeBuddy 安装流程开始..."
            
            # 检查 CodeBuddy 是否已安装
            if check_codebuddy; then
                log_success "CodeBuddy 已安装，无需重复安装"
                exit $STATUS_SUCCESS
            fi
            
            log_info "CodeBuddy 未安装，开始检测环境并安装..."
            
            # 统一调用 install_codebuddy，它会处理所有环境检测和安装逻辑
            if ! install_codebuddy; then
                log_error "CodeBuddy 安装失败"
                exit $STATUS_ERROR
            fi
            
            log_success "CodeBuddy 安装完成"
            ;;
        start)
            # 第一个参数作为启动目录
            shift
            # 尝试使用全局codebuddy
            if command -v codebuddy > /dev/null 2>&1; then
                codebuddy config set -g theme $1
                shift
                codebuddy "$@"
                exit $?
            fi

            # 检查本地安装
            if [ -f "$ORCA_CODEBUDDY_DIR/node_modules/.bin/codebuddy" ]; then
                node_dir="$ORCA_CODEBUDDY_DIR/nodejs"
                node_bin="$node_dir/bin/node"
                 "$node_bin" "$ORCA_CODEBUDDY_DIR/node_modules/.bin/codebuddy" config set -g theme $1
                shift
                "$node_bin" "$ORCA_CODEBUDDY_DIR/node_modules/.bin/codebuddy" "$@"
                exit $?
            fi

            echo "启动失败，请重试"
            exit 1
            ;;
        *)
            log_error "未知操作: $action"
            echo ""
            echo "用法: $0 {install|--version}"
            echo ""
            echo "命令说明："
            echo "  install     安装 CodeBuddy（自动检测并准备 Node.js 环境）"
            echo "  --version   显示脚本版本"
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"

# 使用示例：
# 获取CodeBuddy可执行文件路径并执行
# codebuddy_exec=$(get_codebuddy_executable)
# if [ $? -eq $STATUS_SUCCESS ]; then
#     "$codebuddy_exec" --help
# fi