#!/bin/bash

# 检查是否为 root 用户，如果不是则用 pkexec 重新执行
if [[ $EUID -ne 0 ]]; then
    exec pkexec "$0" "$@"
fi

# 显示使用说明
show_usage() {
    echo "用法: $0 [选项]"
    echo "选项:"
    echo "  --list                列出可卸载的包"
    echo "  --install <包名>      安装指定的 Debian 包"
}

# Debian 包名验证函数
is_valid_deb_package() {
    local package="$1"
    if [[ "$package" =~ ^[a-z0-9][a-z0-9+-.]*$ ]]; then
        return 0
    else
        return 1
    fi
}

# 参数检查
if [[ $# -eq 0 ]]; then
    show_usage
    exit 1
fi

case "$1" in
--list)
    shopt -s nullglob globstar
    APM_ROOT="/var/lib/apm/apm/files/ace-env/var/lib/apm"
    TMP_LIST=$(mktemp)
    # 声明关联数组存储包名到应用名称的映射
    declare -A PKG_NAME_MAP
    
    trap "rm -f '$TMP_LIST'" EXIT

    # 收集 APM 软件包
    for pkgdir in "$APM_ROOT"/*; do
        [[ -d $pkgdir ]] || continue
        pkgname=${pkgdir##*/}
        desktop_name=""
        desktop_files=("$pkgdir"/entries/applications/*.desktop)

        if ((${#desktop_files[@]})); then
            desktop_file=${desktop_files[0]}
            desktop_name=$(grep -P '^Name\[zh_CN\]=' "$desktop_file" | head -n1 | cut -d= -f2-)
            [[ -z $desktop_name ]] && desktop_name=$(grep -P '^Name=' "$desktop_file" | head -n1 | cut -d= -f2-)
        fi

        [[ -z $desktop_name ]] && desktop_name="$pkgname 运行基础"

        # 清理字段
        desktop_name=${desktop_name//$'\r'/ }
        desktop_name=${desktop_name//$'\n'/ }
        desktop_name=${desktop_name//|/ - }
        desktop_name=$(echo "$desktop_name" | sed -E 's/^[[:space:]]+|[[:space:]]+$//g')

        # 存储包名到应用名称的映射
        PKG_NAME_MAP["$pkgname"]="$desktop_name"
        
        echo "FALSE|$desktop_name|$pkgname" >> "$TMP_LIST"
    done

    # 无包提示
    if [[ ! -s $TMP_LIST ]]; then
        zenity --error --text="未找到任何已安装的 APM 包。"
        exit 0
    fi

    # 构造 zenity 参数
    zen_args=(
        --list --checklist
        --title="APM 卸载工具"
        --text="请勾选要卸载的包："
        --column="选择" --column="应用名称" --column="包名"
        --width=600 --height=700
        --separator='|'
        --print-column=3   # 只输出第三列 —— 包名
    )

    # 加载数据
    while IFS='|' read -r sel name pkg; do
        name=${name//$'\r'/ }
        name=${name//$'\n'/ }
        pkg=${pkg//$'\r'/ }
        pkg=${pkg//$'\n'/ }
        zen_args+=( "$sel" "$name" "$pkg" )
    done < "$TMP_LIST"

    # 打开选择窗口
    SELECTED=$(zenity "${zen_args[@]}")
    [[ -z $SELECTED ]] && exit 0

    # 分割多个包
    IFS='|' read -ra PKGS <<< "$SELECTED"

    # 二次确认 - 现在显示应用名称而不是包名
    CONFIRM_TEXT="将卸载以下应用：\n\n"
    for pkg in "${PKGS[@]}"; do
        app_name="${PKG_NAME_MAP[$pkg]}"
        [[ -z "$app_name" ]] && app_name="$pkg"
        CONFIRM_TEXT+="• $app_name\n"
    done
    CONFIRM_TEXT+="\n是否继续？"

    zenity --question --title="确认卸载" --text="$CONFIRM_TEXT" --no-wrap || exit 0
echo "            apm autopurge "$pkg" -y"
    # 执行卸载 - 仍然使用包名卸载
    for pkg in "${PKGS[@]}"; do
        (
            set -x
            apm autopurge "$pkg" -y
        ) 2>&1 | zenity --progress --pulsate --auto-close --text="正在卸载 $pkg ..."
    done

    zenity --info --text="卸载完成。"
    ;;

--install)
    if [[ $# -ne 2 ]]; then
        echo "错误: --install 需要一个参数"
        show_usage
        exit 1
    fi

    package_name="$2"

    if ! is_valid_deb_package "$package_name"; then
        echo "错误: 包名 '$package_name' 不符合 Debian 包名规范"
        exit 1
    fi

    echo "准备安装包: $package_name，输入 Y 继续安装，输入 N 终止安装"
    apm install "$package_name"
    ret=$?
    echo "请按回车退出…………"
    read
    exit $ret
    ;;

*)
    echo "错误: 未知选项 '$1'"
    show_usage
    exit 1
    ;;
esac
