#!/bin/bash

# 20240X LIFUBING CHANGE FOR OPENEULER 24.03 RELEASE
# OpenEuler 24.03环境下AGIROS安装脚本（支持 loong / pixiu 两个发行版）
# 发行版通过菜单选择：loong 支持 x86_64/aarch64/riscv64，pixiu 支持 x86_64/aarch64
# 说明：loong 和 pixiu 的软件包可以放在同一个版本目录下（例如 2612/x86_64/release），
#       脚本仅通过包名前缀（agiros-loong-* / agiros-pixiu-*）和安装路径（/opt/agiros/<发行版>）区分
# 支持两个命令行参数：
#   1. AGIROS_VERSION：发行版版本，不指定时使用所选发行版的默认版本
#      loong 可以指定为2506、2512、2606、2612其中之一，默认2606
#      pixiu 可以指定为2612，默认2612
#   2. RELEASE_TYPE：默认值release，可以指定为release或dailybuild（pixiu 当前仅提供release）
# 示例：bash install.sh                （交互式选择发行版，使用该发行版的默认版本）
# 示例：bash install.sh 2606 release    （loong）
# 示例：bash install.sh 2606 dailybuild （loong）
# 示例：bash install.sh 2612 release    （loong 或 pixiu，取决于菜单选择）


# ===== 配置参数 =====
REPO_URL="http://repo.agiros.org.cn/yumrepo/agiros/openeuler2403lts"

# AGIROS发行版：loong 或 pixiu，由菜单选择后赋值
AGIROS_DISTRO=""

# ===== 发行版配置表 =====
# 后续新增发行版、版本、发布类型或架构时，只需要修改下面这几组配置，脚本其余部分自动适配

# loong发行版配置
# 2612 版本目录下同时存放 loong 与 pixiu 的软件包，loong 的包上传后即可直接安装
LOONG_DEFAULT_VERSION="2606"
LOONG_VERSION_LIST=("2506" "2512" "2606" "2612")
LOONG_RELEASE_TYPE_LIST=("release" "dailybuild")
LOONG_ARCH_LIST=("x86_64" "aarch64" "riscv64")
LOONG_LIB_DIR="lib"

# pixiu发行版配置
PIXIU_DEFAULT_VERSION="2612"
PIXIU_VERSION_LIST=("2612")
PIXIU_RELEASE_TYPE_LIST=("release")
PIXIU_ARCH_LIST=("x86_64" "aarch64")
PIXIU_LIB_DIR="lib"

# 从命令行参数获取AGIROS_VERSION，如果没有提供则使用所选发行版的默认版本
AGIROS_VERSION_ARG="${1:-}"
AGIROS_VERSION=""
# 从命令行参数获取RELEASE_TYPE，如果没有提供则使用默认值release
RELEASE_TYPE=${2:-release}
AGIROS_DEP_URL="http://repo.agiros.org.cn/yumrepo/agiros/agirosdep/agirosdep-0.25.1-py3-none-any.whl"
REPO_CONFIG_PATH="/etc/yum.repos.d/agiros.repo"
BASHRC_PATH="$HOME/.bashrc"

# 彩色输出定义
COLOR_RED="\033[31m"
COLOR_GREEN="\033[32m"
COLOR_RESET="\033[0m"

# 判断指定值是否在列表中，用法：in_list 值 列表元素...
in_list() {
    local needle="$1"
    shift
    local item
    for item in "$@"; do
        if [ "$item" = "$needle" ]; then
            return 0
        fi
    done
    return 1
}

# 用指定分隔符连接列表元素，用法：join_by 分隔符 列表元素...
join_by() {
    local separator="$1"
    shift
    local IFS="$separator"
    echo "$*"
}

# 预先验证AGIROS_VERSION参数是否为已知版本，与发行版的组合校验在发行版选择之后进行
if [[ -n "$AGIROS_VERSION_ARG" ]] && ! in_list "$AGIROS_VERSION_ARG" "${LOONG_VERSION_LIST[@]}" "${PIXIU_VERSION_LIST[@]}"; then
    echo -e "${COLOR_RED}错误：未知的AGIROS_VERSION: ${AGIROS_VERSION_ARG}；loong支持 $(join_by / "${LOONG_VERSION_LIST[@]}")，pixiu支持 $(join_by / "${PIXIU_VERSION_LIST[@]}")${COLOR_RESET}" >&2
    exit 1
fi

# 验证RELEASE_TYPE参数
if [[ "$RELEASE_TYPE" != "release" && "$RELEASE_TYPE" != "dailybuild" ]]; then
    echo -e "${COLOR_RED}错误：RELEASE_TYPE必须为release或dailybuild${COLOR_RESET}" >&2
    exit 1
fi

SUDO=''
if [ "$(id -u)" -ne 0 ]; then
    SUDO='sudo'
fi
echo -e "${COLOR_GREEN}[AGIROS一键安装向导-OpenEuler 24.03]${COLOR_RESET}"
if [[ -n "$AGIROS_VERSION_ARG" ]]; then
    echo -e "${COLOR_GREEN}指定AGIROS版本: ${AGIROS_VERSION_ARG}${COLOR_RESET}"
else
    echo -e "${COLOR_GREEN}AGIROS版本: 未指定，将使用所选发行版的默认版本${COLOR_RESET}"
fi
echo -e "${COLOR_GREEN}使用发布类型: ${RELEASE_TYPE}${COLOR_RESET}"

# 获取OpenEuler的版本信息
echo "检测系统版本..."
OPENEULER_VERSION=$(cat /etc/openEuler-release | grep -oP '\d+\.\d+')
ARCH=$(uname -m)

case "$ARCH" in
    x86_64) 
        echo "CPU架构 X86_64, OpenEuler版本: $OPENEULER_VERSION"
        repo_arch="x86_64"
        ;;
    aarch64) 
        echo "CPU架构 ARM64, OpenEuler版本: $OPENEULER_VERSION"
        repo_arch="aarch64"
        ;;
    riscv64) 
        echo "CPU架构 RISC-V, OpenEuler版本: $OPENEULER_VERSION"
        repo_arch="riscv64"
        ;;
    *)
        echo -e "${COLOR_RED}❌ 当前仅支持x86_64/aarch64/riscv64,检测到不支持的架构: $ARCH${COLOR_RESET}" >&2
        exit 1
        ;;
esac

if [[ "$OPENEULER_VERSION" != "24.03" ]]; then
    echo -e "${COLOR_RED}[ERROR] AGIROS 的 OpenEuler 正式发布版本为 24.03，与当前系统版本不对应${COLOR_RESET}" >&2
    exit 1
fi

check_setup_bash() {
    local ros1_distro_list=("melodic" "noetic")
    local ros2_distro_list=("foxy" "humble")
    local agiros_distro_list=("loong" "pixiu")
    local distro
    local found_agiros=0

    for distro in "${ros1_distro_list[@]}"; do
        local setup_file="/opt/ros/${distro}/setup.bash"
        if [ -f "$setup_file" ]; then
            echo -e "${COLOR_RED}[WARN] 检测到 ros1 $distro, 脚本: $setup_file ${COLOR_RESET}"
        fi
    done

    for distro in "${ros2_distro_list[@]}"; do
        local setup_file="/opt/ros/${distro}/setup.bash"
        if [ -f "$setup_file" ]; then
            echo -e "${COLOR_RED}[WARN] 检测到 ros2 $distro, 脚本: $setup_file ${COLOR_RESET}"
        fi
    done

    for distro in "${agiros_distro_list[@]}"; do
        local setup_file="/opt/agiros/${distro}/setup.bash"
        if [ -f "$setup_file" ]; then
            echo -e "${COLOR_RED}[WARN] 检测到 agiros $distro, 脚本: $setup_file ${COLOR_RESET}"
            found_agiros=1
        fi
    done

    # 如果最终都没找到
    if [ $found_agiros -eq 0 ]; then
        echo -e "${COLOR_GREEN}[INFO] 当前系统未安装AGIROS ${COLOR_RESET}" >&2
    fi
}

echo "检测当前系统是否安装AGIROS..."
check_setup_bash

# 确保直接从终端读取输入：标准输入是终端时直接读取，否则从 /dev/tty 读取
read_input() {
    local prompt="$1"
    local value=""
    if [ -t 0 ]; then
        # 标准输入是终端，直接读取
        read -p "$prompt" value
    else
        # 标准输入不是终端，尝试从 /dev/tty 读取（无可用终端时读到空值，由调用方报错）
        { read -p "$prompt" value </dev/tty; } 2>/dev/null
    fi
    printf '%s' "$value"
}

# 预检查所选发行版/版本/架构/发布类型在仓库中是否可用
# 1) 该目录下是否已有软件包索引（repodata）；2) 索引中是否已包含该发行版的软件包
# 仅作提示，不中断安装：例如 2612 目录下的 loong 软件包可能尚未上传
check_repo_available() {
    local repo_dir="${REPO_URL}/${AGIROS_VERSION}/${repo_arch}/${RELEASE_TYPE}"
    local repomd_url="${repo_dir}/repodata/repomd.xml"
    local listing=""
    local index_ok=0

    echo "检查仓库中 ${AGIROS_DISTRO} ${AGIROS_VERSION}/${repo_arch}/${RELEASE_TYPE} 的软件包..."

    if command -v curl > /dev/null 2>&1; then
        if curl -fsS -o /dev/null -m 15 "$repomd_url"; then
            listing=$(curl -fsS -m 15 "$repo_dir/" 2>/dev/null)
        else
            index_ok=1
        fi
    elif command -v wget > /dev/null 2>&1; then
        if wget -q --spider -T 15 "$repomd_url"; then
            listing=$(wget -q -O - -T 15 "$repo_dir/" 2>/dev/null)
        else
            index_ok=1
        fi
    else
        echo "[INFO] 未找到 curl/wget，跳过仓库可用性预检查"
        return 0
    fi

    if [ "$index_ok" -ne 0 ]; then
        echo -e "${COLOR_RED}[WARN] 仓库中暂未找到 ${AGIROS_VERSION}/${repo_arch}/${RELEASE_TYPE} 的软件包索引（也可能是网络不可达）${COLOR_RESET}" >&2
        echo -e "${COLOR_RED}       地址: ${repomd_url}${COLOR_RESET}" >&2
        echo -e "${COLOR_RED}       若该组合的软件包尚未上传，请改用其它版本，或上传完成后再执行本脚本${COLOR_RESET}" >&2
    elif [ -z "$listing" ]; then
        echo "[INFO] 无法获取仓库目录列表，跳过软件包预检查"
    elif printf '%s' "$listing" | grep -q "agiros-${AGIROS_DISTRO}-"; then
        echo "[INFO] 仓库检查通过：已找到 agiros-${AGIROS_DISTRO} 软件包"
    elif printf '%s' "$listing" | grep -q '\.rpm'; then
        echo -e "${COLOR_RED}[WARN] 仓库目录中暂未发现 agiros-${AGIROS_DISTRO} 的软件包${COLOR_RESET}" >&2
        echo -e "${COLOR_RED}       目录: ${repo_dir}/${COLOR_RESET}" >&2
        echo -e "${COLOR_RED}       若该发行版的软件包还未上传，安装时会因找不到软件包而失败${COLOR_RESET}" >&2
    else
        echo "[INFO] 仓库检查通过（目录列表为空或格式未知，安装结果以 dnf 为准）"
    fi
    return 0
}

# ===== 选择AGIROS发行版（loong / pixiu）=====
echo "---------AGIROS发行版菜单-----------"
echo -e "${COLOR_GREEN}1. ${COLOR_RESET}loong 发行版（版本2506/2512/2606/2612，支持x86_64/aarch64/riscv64）"
echo -e "${COLOR_GREEN}2. ${COLOR_RESET}pixiu 发行版（版本2612，支持x86_64/aarch64）"
echo "3. 退出"
distro_choice=$(read_input "请输入数字 (1/2/3): ")

if [[ -z "$distro_choice" ]]; then
    echo -e "${COLOR_RED}错误：未输入任何内容${COLOR_RESET}" >&2
    exit 1
fi
echo "用户输入了：$distro_choice"

case "$distro_choice" in
    1)
        AGIROS_DISTRO="loong"
        DEFAULT_AGIROS_VERSION="$LOONG_DEFAULT_VERSION"
        SUPPORTED_VERSION_LIST=("${LOONG_VERSION_LIST[@]}")
        SUPPORTED_RELEASE_TYPE_LIST=("${LOONG_RELEASE_TYPE_LIST[@]}")
        SUPPORTED_ARCH_LIST=("${LOONG_ARCH_LIST[@]}")
        AGIROS_LIB_DIR="$LOONG_LIB_DIR"
        ;;
    2)
        AGIROS_DISTRO="pixiu"
        DEFAULT_AGIROS_VERSION="$PIXIU_DEFAULT_VERSION"
        SUPPORTED_VERSION_LIST=("${PIXIU_VERSION_LIST[@]}")
        SUPPORTED_RELEASE_TYPE_LIST=("${PIXIU_RELEASE_TYPE_LIST[@]}")
        SUPPORTED_ARCH_LIST=("${PIXIU_ARCH_LIST[@]}")
        AGIROS_LIB_DIR="$PIXIU_LIB_DIR"
        ;;
    3)
        echo "正常退出脚本"
        exit 0
        ;;
    *)
        echo -e "${COLOR_RED}错误：无效的选择，请输入1-3之间的数字${COLOR_RESET}" >&2
        exit 1
        ;;
esac

# ===== 校验发行版与版本/架构/发布类型的组合 =====
if [[ -z "$AGIROS_VERSION_ARG" ]]; then
    AGIROS_VERSION="$DEFAULT_AGIROS_VERSION"
    echo -e "${COLOR_GREEN}已选择AGIROS发行版: ${AGIROS_DISTRO}，使用默认版本: ${AGIROS_VERSION}${COLOR_RESET}"
else
    AGIROS_VERSION="$AGIROS_VERSION_ARG"
    if ! in_list "$AGIROS_VERSION" "${SUPPORTED_VERSION_LIST[@]}"; then
        echo -e "${COLOR_RED}错误：${AGIROS_DISTRO}发行版不支持版本 ${AGIROS_VERSION}，当前支持: $(join_by / "${SUPPORTED_VERSION_LIST[@]}")${COLOR_RESET}" >&2
        exit 1
    fi
    echo -e "${COLOR_GREEN}已选择AGIROS发行版: ${AGIROS_DISTRO}，使用指定版本: ${AGIROS_VERSION}${COLOR_RESET}"
fi

if ! in_list "$ARCH" "${SUPPORTED_ARCH_LIST[@]}"; then
    echo -e "${COLOR_RED}错误：${AGIROS_DISTRO}发行版暂不支持 ${ARCH} 架构，当前支持: $(join_by / "${SUPPORTED_ARCH_LIST[@]}")${COLOR_RESET}" >&2
    exit 1
fi

if ! in_list "$RELEASE_TYPE" "${SUPPORTED_RELEASE_TYPE_LIST[@]}"; then
    echo -e "${COLOR_RED}错误：${AGIROS_DISTRO}发行版暂不支持 ${RELEASE_TYPE} 发布类型，当前支持: $(join_by / "${SUPPORTED_RELEASE_TYPE_LIST[@]}")${COLOR_RESET}" >&2
    exit 1
fi

# 仓库可用性预检查（仅提示）
check_repo_available

# ===== AGIROS安装菜单 =====
echo "---------AGIROS安装菜单（${AGIROS_DISTRO} ${AGIROS_VERSION}）-----------"
echo -e "${COLOR_GREEN}1. ${COLOR_RESET}安装ros-base和开发工具"
echo "2. 安装desktop和开发工具"
echo "3. 安装desktop-full和开发工具"
echo "4. 清理AGIROS环境"
echo "5. 退出"
choice=$(read_input "请输入数字 (1/2/3/4/5): ")

if [[ -z "$choice" ]]; then
    echo -e "${COLOR_RED}错误：未输入任何内容${COLOR_RESET}" >&2
    exit 1
fi
echo "用户输入了：$choice"

# 验证输入是否为1-5的数字
if ! [[ "$choice" =~ ^[1-5]$ ]]; then
    echo -e "${COLOR_RED}错误：无效的选择，请输入1-5之间的数字${COLOR_RESET}" >&2
    exit 1
fi

init() {
    # 检查当前时区是否已经正确设置
    CURRENT_TIMEZONE=$(readlink /etc/localtime 2>/dev/null || echo "")
    EXPECTED_TIMEZONE="/usr/share/zoneinfo/Asia/Shanghai"

    if [[ "$CURRENT_TIMEZONE" == "$EXPECTED_TIMEZONE" ]]; then
        echo "时区已正确设置为 Asia/Shanghai，跳过设置"
    else
        # 检查并安装 tzdata（如果缺失）
        if ! rpm -q tzdata &> /dev/null; then
            echo "tzdata 包未找到，正在安装..."
            $SUDO dnf install -y tzdata
        fi
        
        # 设置时区为 Asia/Shanghai
        echo "设置时区为 Asia/Shanghai..."
        $SUDO ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
        $SUDO echo "Asia/Shanghai" > /etc/timezone
    fi

    # 添加 YUM 源
    echo "配置软件仓库源..."
    # 删除旧的仓库配置文件以确保完全覆盖
    if [ -f "$REPO_CONFIG_PATH" ]; then
        $SUDO rm -f "$REPO_CONFIG_PATH"
        echo "已删除旧的仓库配置文件: $REPO_CONFIG_PATH"
    fi
    $SUDO tee "$REPO_CONFIG_PATH" >/dev/null <<EOL

[agiros-main-packages]
name=agiros-main-packages
baseurl=${REPO_URL}/$AGIROS_VERSION/$repo_arch/$RELEASE_TYPE
enabled=1
gpgcheck=0

[agiros-third-packages]
name=agiros-third-packages
baseurl=${REPO_URL}/$AGIROS_VERSION/\$basearch/3-party
enabled=1
gpgcheck=0
EOL

    # 更新缓存
    echo "更新软件包列表..."
    dnf clean all
    if ! $SUDO dnf makecache; then
        echo -e "${COLOR_RED}更新软件包列表失败${COLOR_RESET}" >&2
        exit 1
    fi
    
    
    # ===== 新增：卸载系统原有OpenCV并安装指定版本（适用于所有架构）=====
    echo -e "\033[1;33m===== 处理OpenCV =====\033[0m"
    
    # 卸载系统中原有的OpenCV
    echo "1. 卸载系统中原有的OpenCV..."
    if rpm -q opencv &> /dev/null; then
        $SUDO rpm -e --nodeps opencv
        echo "✅ 已卸载原有的OpenCV"
    else
        echo "[INFO] 系统中未检测到已安装的OpenCV"
    fi
    
    # 根据当前架构构建OpenCV RPM包名
    case "$ARCH" in
        x86_64)
            opencv_arch="x86_64"
            ;;
        aarch64)
            opencv_arch="aarch64"
            ;;
        riscv64)
            opencv_arch="riscv64"
            ;;
        *)
            echo -e "${COLOR_RED}不支持的架构: $ARCH，无法安装OpenCV${COLOR_RESET}" >&2
            exit 1
            ;;
    esac
    
    # 下载并安装指定版本的OpenCV
    echo "2. 下载指定版本的OpenCV (${opencv_arch})..."
    OPENCV_RPM="opencv-4.5.2-9.oe2403.${opencv_arch}.rpm"
    OPENCV_URL="${REPO_URL}/${AGIROS_VERSION}/${opencv_arch}/3-party/${OPENCV_RPM}"
    
    echo "下载地址: ${OPENCV_URL}"
    
    # 下载OpenCV RPM包
    if wget -q --show-progress "$OPENCV_URL"; then
        echo "✅ OpenCV RPM包下载成功"
        
        # 使用yum安装以解决依赖
        echo "3. 安装OpenCV及其依赖..."
        $SUDO yum install -y "./${OPENCV_RPM}"
        
        # 确保安装完成
        if $SUDO rpm -i "./${OPENCV_RPM}" 2>/dev/null; then
            echo "✅ OpenCV安装完成"
        else
            echo "[OK] OpenCV已通过yum安装"
        fi
        
        # 清理下载的RPM包
        rm -f "./${OPENCV_RPM}"
    else
        echo -e "${COLOR_RED}❌ OpenCV RPM包下载失败，请检查网络连接或URL地址${COLOR_RESET}" >&2
        echo -e "${COLOR_RED}URL: ${OPENCV_URL}${COLOR_RESET}" >&2
        exit 1
    fi
}

# 配置环境变量
configure_environment_variable() {
    local env_var_dir="/opt/agiros/${AGIROS_DISTRO}"
    local setup_bash="${env_var_dir}/setup.bash"

    if [ -f "$setup_bash" ]; then
        echo "找到 AGIROS ${AGIROS_DISTRO} 环境配置文件: $setup_bash"
    else
        echo -e "${COLOR_RED}❌ 错误：未找到 AGIROS setup.bash 文件，请确认是否已安装 AGiROS${COLOR_RESET}" >&2
        exit 1
    fi
    
    # 添加环境变量
    env_var_key="export PATH=$env_var_dir:\$PATH"
    if ! grep -qF "$env_var_key" "$BASHRC_PATH"; then
        if ! echo -e "\n$env_var_key\n" >> "$BASHRC_PATH"; then
            echo "写入环境变量失败"
            exit 1
        fi
        echo "✅ 环境变量已成功添加到 $BASHRC_PATH"
    else
        echo "[INFO] 环境变量已存在于 $BASHRC_PATH 中"
    fi
    
    # 添加AGIROS ${AGIROS_DISTRO}环境配置
    source "$setup_bash"

    if ! grep -qF "source $setup_bash" "$BASHRC_PATH"; then
        if ! echo "source $setup_bash" >> "$BASHRC_PATH"; then
            echo "添加AGIROS ${AGIROS_DISTRO}环境配置到 $BASHRC_PATH 失败"
            exit 1
        fi
        echo "已将 source $setup_bash 添加到 $BASHRC_PATH"
    else
        echo "source $setup_bash 已存在于 $BASHRC_PATH 中"
    fi
    
    
    # ===== 新增：添加动态库查找路径（与.bashrc配置放在一起）=====
    # 说明：agiros 的软件包实际安装在 <前缀>/lib 下，历史版本脚本曾按 <前缀>/lib64 配置，
    #       这里顺带把旧配置就地修正，避免 .bashrc 中残留无效路径
    local old_ld_library_path_key="export LD_LIBRARY_PATH=${env_var_dir}/lib64:\$LD_LIBRARY_PATH"
    if grep -qF "$old_ld_library_path_key" "$BASHRC_PATH"; then
        sed -i "s|^export LD_LIBRARY_PATH=${env_var_dir}/lib64:\\\$LD_LIBRARY_PATH\$|export LD_LIBRARY_PATH=${env_var_dir}/${AGIROS_LIB_DIR}:\\\$LD_LIBRARY_PATH|" "$BASHRC_PATH"
        echo "✅ 已将 $BASHRC_PATH 中旧的 ${env_var_dir}/lib64 配置修正为 ${env_var_dir}/${AGIROS_LIB_DIR}"
    fi

    ld_library_path_key="export LD_LIBRARY_PATH=${env_var_dir}/${AGIROS_LIB_DIR}:\$LD_LIBRARY_PATH"
    if ! grep -qF "export LD_LIBRARY_PATH=${env_var_dir}/${AGIROS_LIB_DIR}" "$BASHRC_PATH"; then
        if ! echo "$ld_library_path_key" >> "$BASHRC_PATH"; then
            echo "添加动态库查找路径到 $BASHRC_PATH 失败"
            exit 1
        fi
        echo "✅ 已将动态库查找路径添加到 $BASHRC_PATH"
    else
        echo "[INFO] 动态库查找路径已存在于 $BASHRC_PATH 中"
    fi
    
    
    source "$BASHRC_PATH"
    echo "[INFO] 已执行 'source $BASHRC_PATH' 使环境变量生效"
}

# ===== 清理缓存函数（新增）=====
clean_cache() {
    echo -e "\n\033[1;33m===== 清理系统缓存 =====\033[0m"
    
    # 清理dnf缓存
    echo "1. 清理dnf缓存..."
    $SUDO dnf clean all
    $SUDO rm -rf /var/cache/dnf/*

    echo "2. 修正dnf可能的错误"
    $SUDO dnf makecache
    $SUDO dnf check-update
}

# ===== 删除现有配置 =====
cleanup_system() {
    echo -e "\n\033[1;33m===== 清理现有配置 =====\033[0m"
    
    # 删除仓库配置
    echo "移除仓库配置文件 $REPO_CONFIG_PATH"
    $SUDO rm -f "$REPO_CONFIG_PATH"

    # 调用缓存清理函数（新增）
    clean_cache

    echo -e "\n\033[1;32m✔ 所有仓库配置和系统缓存已成功移除\033[0m"
}

# 安装开发工具
install_tools() {
    echo "[INFO] 安装开发工具和依赖..."
    $SUDO dnf install -y \
        make \
        cmake \
        gcc \
        gcc-c++ \
        curl \
        wget \
        vim \
        nano \
        git \
        python3 \
        python3-devel \
        python3-flake8 \
        python3-pytest-cov \
        python3-pip \
        python3-setuptools \
        zbar-devel

    # 安装额外的Python工具
    echo "安装额外的Python工具..."

    #安装colcon相关工具
    pip3 install -U -i https://pypi.tuna.tsinghua.edu.cn/simple \
        colcon-common-extensions \
        colcon-mixin \

    # 检查pip版本并相应调整安装命令
    PIP_VERSION=$(pip3 --version | awk '{print $2}' | cut -d. -f1)

    if [ "$PIP_VERSION" -ge 23 ]; then
        # 新版本pip使用 --break-system-packages
        pip3 install -U -i https://pypi.tuna.tsinghua.edu.cn/simple \
            argcomplete \
            pytest-repeat \
            pytest-rerunfailures \
            --break-system-packages
    else
        # 旧版本pip不需要 --break-system-packages
        pip3 install -U -i https://pypi.tuna.tsinghua.edu.cn/simple \
            argcomplete \
            pytest-repeat \
            pytest-rerunfailures
    fi

    echo "配置并初始化agirosdep..."
    if [ ! -f "/etc/agiros/agirosdep/sources.list.d/20-default.list" ]; then
        $SUDO pip install $AGIROS_DEP_URL

        # 初始化rosdep
        $SUDO agirosdep init || true

        # 更新rosdep
        echo "更新agirosdep..."
        agirosdep update
    fi
}

install_package() {
    local install_mode="$1"
    local package_name=""
    
    case $install_mode in
        1) 
            init
            package_name="agiros-${AGIROS_DISTRO}-ros-base agiros-${AGIROS_DISTRO}-turtlesim"
            ;;
        2) 
            init
            package_name="agiros-${AGIROS_DISTRO}-desktop agiros-${AGIROS_DISTRO}-turtlesim"
            ;;
        3) 
            init
            package_name="agiros-${AGIROS_DISTRO}-desktop-full agiros-${AGIROS_DISTRO}-turtlesim"
            ;;
        4) 
            cleanup_system
            exit 0
            ;;
        5) 
            echo "正常退出脚本"
            exit 0
            ;;
        *)
            echo "输入错误，请输入1-5"
            exit 1
            ;;
    esac
    
    echo "开始安装 $package_name ..."
    if ! $SUDO dnf install -y $package_name; then
        echo "[WARN] 安装失败，尝试修复依赖..."
        
        # 尝试使用 --allowerasing 选项修复依赖
        if ! $SUDO dnf install -y --allowerasing $package_name; then
            echo -e "${COLOR_RED}❌ 依赖修复失败，请手动处理${COLOR_RESET}" >&2
            exit 1
        fi
    fi

    echo "配置环境变量..."
    configure_environment_variable   

    $SUDO dnf clean all
    echo -e "${COLOR_GREEN}✅ $package_name 安装成功！${COLOR_RESET}"

    echo "安装开发工具..."
    install_tools

    # 验证安装
    echo "验证AGIROS安装..."
    if command -v agiros &> /dev/null; then
        echo "✅ AGIROS已安装成功"
    else
        echo "agiros 命令未找到，可能需要重新启动终端或手动source环境变量"
        echo "请运行: source $BASHRC_PATH"
    fi
}

install_package "$choice"
