#!/usr/bin/env bash
# Description: 卸载软件TUI（支持卸载pacman、AUR和Flatpak软件）
# ==============================================================================
# 启用严格的错误处理机制
set -euo pipefail

# 获取脚本自身的绝对路径，确保 reload 动作在任何路径下都能正确调用自身
SCRIPT_PATH=$(readlink -f "$0" 2>/dev/null || realpath "$0" 2>/dev/null || echo "$0")
export SHELL=$(grep -m 1 -E '^/.*/bash$' /etc/shells || echo "/bin/bash")

# --- 1. 隐藏的内部调用：用于双轨并行生成/刷新数据 ---
if [[ "${1:-}" == "--generate-data" ]]; then
    AWK_CMD_PACMAN='
        NR==FNR {
            if (!($2 in repo)) { repo[$2] = $1 }
            next
        }
        {
            pkg_name = $1; pkg_ver = $2
            rname = (pkg_name in repo) ? repo[pkg_name] : "aur"
            color = (pkg_name in repo) ? cb : cp
            
            # 【修复点1】先打印带有颜色的来源，紧接着打印重置符 \033[0m
            printf "PKG: %s%s%s", color, rname, r
            
            # 【修复点2】将用于对齐的空格垫在重置符之后，确保 awk 切分字段不会把 \033[0m 算作独立字段
            for(i=length(rname); i<16; i++) printf " "
            
            printf " %-35s %s\n", pkg_name, pkg_ver
        }
    '

    AWK_CMD_FLATPAK='
        {
            if (NF < 3) next
            app_id = $1; origin = $2
            $1=""; $2=""; name=$0
            sub(/^[ \t]+/, "", name); sub(/[ \t]+$/, "", name)
            
            # 同理，处理 Flatpak 的对齐与空格
            printf "FLTK: %s%s%s", cc, origin, r
            for(i=length(origin); i<16; i++) printf " "
            printf " %-35s %s\n", name, app_id
        }
    '

    # 生成 Pacman 数据
    awk -v cb='\033[34m' -v cp='\033[35m' -v r='\033[0m' \
        "$AWK_CMD_PACMAN" <(pacman --color=never -Sl 2>/dev/null || true) <(pacman --color=never -Q)

    # 生成 Flatpak 数据 (如果存在)
    if command -v flatpak >/dev/null 2>&1; then
        flatpak list --app --columns=application,origin,name 2>/dev/null | \
        awk -v cc='\033[36m' -v r='\033[0m' "$AWK_CMD_FLATPAK" || true
    fi
    exit 0
fi

# --- 2. 环境与多语言字典配置 ---
ORIGINAL_LANG="${LC_ALL:-${LC_MESSAGES:-${LANG:-C}}}"
SHOW_HELP=false
QUERY_ARGS=()

declare -A MSG
if [[ "$ORIGINAL_LANG" == *"zh_CN"* ]]; then
    MSG[DESC]="统一模糊搜索并卸载系统软件包 (支持 Pacman/AUR 与 Flatpak)。"
    MSG[OPTS]="选项："
    MSG[OPT_HELP]="  --help, -h    显示此帮助信息并退出"
    MSG[FEAT]="功能特性："
    MSG[FEAT_1]="- 大一统架构：同屏混合显示并多选 Native 包与 Flatpak 应用"
    MSG[FEAT_2]="- 彻底与安全：Pacman 递归删除配置 (-Rns)，Flatpak 原生防误删保护"
    MSG[FEAT_3]="- 视觉标识：蓝色(官方源) | 紫色(AUR) | 青色(Flatpak)"
    MSG[EX]="示例："
    MSG[ERR_FZF]="错误：未找到 fzf，请先安装。"
    MSG[ERR_HELPER]="错误：未找到 paru 或 yay，请至少安装其中一个作为 AUR 助手。"
    MSG[REMOVING_PAC]=">> 准备卸载 (Pacman/AUR)："
    MSG[REMOVING_FPK]=">> 准备卸载 (Flatpak)："
    MSG[HEADER]="Tab:多选 | Enter:卸载 | Ctrl+R:刷新 | Esc:退出"
else
    MSG[DESC]="Unified fuzzy search & remove for system packages (Pacman/AUR & Flatpak)."
    MSG[OPTS]="Options:"
    MSG[OPT_HELP]="  --help, -h    Show this help and exit"
    MSG[FEAT]="Features:"
    MSG[FEAT_1]="- Unified UI: Mix, multi-select and remove Native & Flatpak apps together"
    MSG[FEAT_2]="- Safe & Clean: Pacman recursive remove (-Rns), Flatpak native protection"
    MSG[FEAT_3]="- Visuals: Blue(Repo) | Purple(AUR) | Cyan(Flatpak)"
    MSG[EX]="Example:"
    MSG[ERR_FZF]="Error: fzf not found."
    MSG[ERR_HELPER]="Error: Neither paru nor yay found. Please install an AUR helper."
    MSG[REMOVING_PAC]=">> Preparing to remove (Pacman/AUR):"
    MSG[REMOVING_FPK]=">> Preparing to remove (Flatpak):"
    MSG[HEADER]="Tab:Multi-Select | Enter:Remove | Ctrl+R:Reload | Esc:Exit"
fi

# --- 3. 参数解析 ---
while [[ $# -gt 0 ]]; do
    case "$1" in
        --help|-h)
            SHOW_HELP=true
            shift
            ;;
        *)
            QUERY_ARGS+=("$1")
            shift
            ;;
    esac
done

# --- 4. 核心依赖检查与动态 Helper 探测 ---
command -v fzf >/dev/null 2>&1 || { echo "${MSG[ERR_FZF]}" >&2; exit 1; }

AUR_HELPER=""
if command -v paru >/dev/null 2>&1; then
    AUR_HELPER="paru"
elif command -v yay >/dev/null 2>&1; then
    AUR_HELPER="yay"
else
    echo "${MSG[ERR_HELPER]}" >&2
    exit 1
fi

HAS_FLATPAK=false
if command -v flatpak >/dev/null 2>&1; then
    HAS_FLATPAK=true
fi

# --- 5. 帮助信息拦截 ---
if [ "$SHOW_HELP" = true ]; then
    cat <<EOF
Usage: ${0##*/} [options] [query]

${MSG[OPTS]}
${MSG[OPT_HELP]}

Description:
  ${MSG[DESC]}

${MSG[FEAT]}
  ${MSG[FEAT_1]}
  ${MSG[FEAT_2]}
  ${MSG[FEAT_3]}

${MSG[EX]}
  ${0##*/} firefox        # 搜索并卸载 'firefox' (无缝跨越两端)
  ${0##*/}                # 列出所有已安装的包
EOF
    exit 0
fi

# --- 6. 文件安全设置 ---
TMP_DIR=$(mktemp -d -t unified_pacr.XXXXXX)
TARGET_FILE="${TMP_DIR}/target"

cleanup() {
    rm -rf "$TMP_DIR"
}
trap cleanup EXIT INT TERM

# --- 7. 交互式 FZF 渲染与智能预览 ---
# 这里 $3 能精准提取包名，不再被颜色符干扰
PREVIEW_CMD="
line={}
if [[ \"\$line\" == PKG:* ]]; then
    pkg=\$(echo \"\$line\" | awk '{print \$3}')
    ${AUR_HELPER} -Qi \"\$pkg\"
elif [[ \"\$line\" == FLTK:* ]]; then
    appid=\$(echo \"\$line\" | awk '{print \$NF}')
    flatpak info \"\$appid\"
fi
"

COLOR_YELLOW=$'\033[33m'
COLOR_CYAN=$'\033[36m'
COLOR_RESET=$'\033[0m'
FZF_HEADER="${MSG[HEADER]} | ${COLOR_YELLOW}${AUR_HELPER}${COLOR_RESET}"
if [ "$HAS_FLATPAK" = true ]; then
    FZF_HEADER+=" & ${COLOR_CYAN}Flatpak${COLOR_RESET}"
fi

set +e
# 【修复点3】去掉了 --nth=3.. 解锁全部字段搜索，支持搜索软件名、仓库名(aur/flathub) 和 版本号
fzf --multi --ansi \
    --preview "$PREVIEW_CMD" \
    --preview-window=down:55%:wrap \
    --height=95% --layout=reverse --border \
    --bind "alt-j:last,alt-k:first" \
    --bind "ctrl-r:reload(\"$SCRIPT_PATH\" --generate-data)" \
    --tiebreak=index \
    --with-nth=2.. \
    --header "$FZF_HEADER" \
    --query "${QUERY_ARGS[*]:-}" \
    < <("$SCRIPT_PATH" --generate-data) \
    > "$TARGET_FILE"
FZF_EXIT=$?
set -e

# --- 8. 执行卸载逻辑 (分发处理) ---
if [[ $FZF_EXIT -eq 0 ]] && [[ -s "$TARGET_FILE" ]]; then
    mapfile -t SELECTED_LINES < "$TARGET_FILE"
    PAC_PKGS=()
    FPK_PKGS=()
    
    # 拆分选中的项目
    for line in "${SELECTED_LINES[@]}"; do
        if [[ "$line" == PKG:* ]]; then
            pkg=$(echo "$line" | awk '{print $3}')
            [[ -n "$pkg" ]] && PAC_PKGS+=("$pkg")
        elif [[ "$line" == FLTK:* ]]; then
            appid=$(echo "$line" | awk '{print $NF}')
            [[ -n "$appid" ]] && FPK_PKGS+=("$appid")
        fi
    done
    
    # 执行 Pacman/AUR 卸载
    if [[ ${#PAC_PKGS[@]} -gt 0 ]]; then
        echo -e "\n\033[34m${MSG[REMOVING_PAC]}\033[0m"
        echo "${PAC_PKGS[*]}"
        echo "----------------------------------------"
        "$AUR_HELPER" -Rns "${PAC_PKGS[@]}"
    fi

    # 执行 Flatpak 卸载
    if [[ ${#FPK_PKGS[@]} -gt 0 ]]; then
        echo -e "\n\033[36m${MSG[REMOVING_FPK]}\033[0m"
        echo "${FPK_PKGS[*]}"
        echo "----------------------------------------"
        flatpak uninstall "${FPK_PKGS[@]}"
    fi
fi
