#!/usr/bin/env bash
# Description: Pacman/AUR软件包模糊搜索与安装 TUI
# ==============================================================================
# 启用严格的错误处理机制
set -euo pipefail

# 记录初始语言环境，并强制 C locale 确保 awk 解析的一致性
ORIGINAL_LANG="${LC_ALL:-${LC_MESSAGES:-${LANG:-C}}}"
export LC_ALL=C

# --- 0. 内部生成器拦截 (由 fzf reload 或后台进程触发) ---
if [[ "${1:-}" == "--generate-list" ]]; then
    FORCE_REFRESH="$2"
    INSTALLED_LIST="$3"
    AUR_CACHE="$4"
    AUR_FILTER="$5"
    MSG_INSTALLED="$6"
    CACHE_TIME=3600

    AWK_CMD='
        FNR==NR { installed[$1]=1; next }
        {
            status = ($2 in installed) ? ci " ✔ " label r : ""
            printf "%s%-10s%s %-30s %-20s %s\n", c, $1, r, $2, $3, status
        }
    '

    # 动态获取并刷新本地已安装包的状态列表
    pacman -Qq > "$INSTALLED_LIST" || true

    # 1. 官方源数据
    pacman -Sl | awk -v c='\033[34m' -v ci='\033[32m' -v r='\033[0m' \
        -v label="$MSG_INSTALLED" \
        "$AWK_CMD" "$INSTALLED_LIST" -

    # 2. AUR 数据 (根据条件判定是否拉取远程压缩包)
    if [[ "$FORCE_REFRESH" == true ]] || [[ ! -f "$AUR_CACHE" ]] || [[ $(find "$AUR_CACHE" -mmin +$((CACHE_TIME / 60)) 2>/dev/null) ]]; then
        curl -sL https://aur.archlinux.org/packages.gz | zcat > "$AUR_CACHE" || true
    fi

    if [[ -s "$AUR_CACHE" ]]; then
        grep -vE "$AUR_FILTER" "$AUR_CACHE" 2>/dev/null | \
        awk '{print "aur", $1, "-"}' | \
        awk -v c='\033[35m' -v ci='\033[32m' -v r='\033[0m' \
            -v label="$MSG_INSTALLED" \
            "$AWK_CMD" "$INSTALLED_LIST" -
    fi
    exit 0
fi

# --- 1. 环境与基础配置 ---
SHOW_HELP=false
FORCE_REFRESH=false
QUERY_ARGS=()

# 获取脚本自身的绝对路径，确保在 fzf 子进程 reload 时能准确自我调用
SCRIPT_PATH="$(realpath "$0" 2>/dev/null || echo "$0")"

# --- 2. 参数解析 ---
while [[ $# -gt 0 ]]; do
    case "$1" in
        --help|-h)
            SHOW_HELP=true
            shift
            ;;
        --refresh|-y)
            FORCE_REFRESH=true
            shift
            ;;
        *)
            # 收集搜索关键字
            QUERY_ARGS+=("$1")
            shift
            ;;
    esac
done

# --- 3. 本地化多语言字典 (使用安全的关联数组) ---
declare -A MSG
if [[ "$ORIGINAL_LANG" == *"zh_CN"* ]]; then
    MSG[DESC]="模糊搜索并安装软件包 (支持官方源和 AUR)。"
    MSG[OPTS]="选项："
    MSG[OPT_HELP]="  --help, -h    显示此帮助信息并退出"
    MSG[OPT_REFRESH]="  --refresh, -y 强制拉取并刷新 AUR 软件包本地缓存列表"
    MSG[FEAT]="功能特性："
    MSG[FEAT_1]="- 准确状态：显示 [已安装] 标记"
    MSG[FEAT_2]="- 视觉区分：蓝色(官方) 紫色(AUR)"
    MSG[FEAT_3]="- 智能降级：自动探测使用 paru 或 yay"
    MSG[FEAT_4]="- 快捷刷新：fzf 界面内按 Ctrl+R 强制重载并拉取最新缓存"
    MSG[EX]="示例："
    MSG[ERR_FZF]="错误：未找到 fzf，请先安装。"
    MSG[ERR_HELPER]="错误：未找到 paru 或 yay，请至少安装其中一个作为 AUR 助手。"
    MSG[INSTALLED]="[已安装]"
    MSG[INSTALLING]=">> 准备安装："
    MSG[HEADER]="Tab:多选 | Enter:安装 | Ctrl+R:强制刷新 | Esc:退出"
else
    MSG[DESC]="Fuzzy search & install packages (Repo + AUR)."
    MSG[OPTS]="Options:"
    MSG[OPT_HELP]="  --help, -h    Show this help and exit"
    MSG[OPT_REFRESH]="  --refresh, -y Force refresh AUR package cache list"
    MSG[FEAT]="Features:"
    MSG[FEAT_1]="- Accurate status: [Installed] tag"
    MSG[FEAT_2]="- Visuals: Blue(Repo) Purple(AUR)"
    MSG[FEAT_3]="- Smart Fallback: Auto-detects paru or yay"
    MSG[FEAT_4]="- Quick Refresh: Press Ctrl+R in TUI to force refresh"
    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[INSTALLED]="[Installed]"
    MSG[INSTALLING]=">> Installing:"
    MSG[HEADER]="Tab:Multi-Select | Enter:Install | Ctrl+R:Force Refresh | Esc:Exit"
fi

# --- 4. 帮助信息拦截 ---
# 修复：if 和 [ 之间必须有空格
if [ "$SHOW_HELP" = true ]; then
    cat <<EOF
Usage: ${0##*/} [options] [query]

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

Description:
  ${MSG[DESC]}

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

${MSG[EX]}
  ${0##*/} firefox        # 搜索 'firefox'
  ${0##*/} -y             # 强制刷新 AUR 列表并列出所有包
EOF
    exit 0
fi

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

# 动态绑定 AUR 助手 (paru 优先，yay 兜底)
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

# --- 6. 异步逻辑与文件安全设置 (XDG 规范缓存) ---
TMP_DIR=$(mktemp -d -t pac_fzf.XXXXXX)
TARGET_FILE="${TMP_DIR}/target"
INSTALLED_LIST="${TMP_DIR}/installed"
PIPE_FIFO="${TMP_DIR}/fifo"
mkfifo "$PIPE_FIFO"

CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/pac_tui"
mkdir -p "$CACHE_DIR"

AUR_CACHE="${CACHE_DIR}/aur_packages.gz.txt"
AUR_FILTER='^(mingw-|lib32-|cross-|.*-debug$)'
PREVIEW_CMD="$AUR_HELPER -Si {2}"

cleanup() {
    if [[ -n "${PID_GEN:-}" ]]; then kill "$PID_GEN" 2>/dev/null || true; fi
    rm -rf "$TMP_DIR"
}
trap cleanup EXIT INT TERM

# --- 7. 数据生成器 (后台运行) ---
# 利用内部自调用作为守护进程生成初始列表
"$SCRIPT_PATH" --generate-list "$FORCE_REFRESH" "$INSTALLED_LIST" "$AUR_CACHE" "$AUR_FILTER" "${MSG[INSTALLED]}" > "$PIPE_FIFO" 2>/dev/null &
PID_GEN=$!

# --- 8. 交互式 FZF 渲染 ---
COLOR_YELLOW=$'\033[33m'
COLOR_RESET=$'\033[0m'
FZF_HEADER="${MSG[HEADER]} | ${COLOR_YELLOW}Using ${AUR_HELPER}${COLOR_RESET}"

# 构造安全的 reload 命令（利用 printf 转义变量，防止路径中包含空格等字符导致执行崩溃）
RELOAD_CMD=$(printf "%q " "$SCRIPT_PATH" --generate-list true "$INSTALLED_LIST" "$AUR_CACHE" "$AUR_FILTER" "${MSG[INSTALLED]}")

set +e
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($RELOAD_CMD)" \
    --tiebreak=index \
    --nth=2 \
    --header "$FZF_HEADER" \
    --query "${QUERY_ARGS[*]:-}" \
    < "$PIPE_FIFO" \
    > "$TARGET_FILE"
FZF_EXIT=$?
set -e

# --- 9. 执行安装 ---
if [[ $FZF_EXIT -eq 0 ]] && [[ -s "$TARGET_FILE" ]]; then
    mapfile -t SELECTED_LINES < "$TARGET_FILE"
    PACKAGES=()
    for line in "${SELECTED_LINES[@]}"; do
        pkg=$(echo "$line" | awk '{print $2}')
        [[ -n "$pkg" ]] && PACKAGES+=("$pkg")
    done
    
    if [[ ${#PACKAGES[@]} -gt 0 ]]; then
        echo -e "\n\033[32m${MSG[INSTALLING]}\033[0m"
        echo "${PACKAGES[*]}"
        echo "----------------------------------------"
        "$AUR_HELPER" -S "${PACKAGES[@]}"
    fi
fi
