#!/usr/bin/env bash
#
# UbuntuClash 卸载脚本 (支持 Bash / Zsh)
#
# 面向管道执行, 例如:
#   curl -fsSL <base>/ubuntu-clash/unix/uninstall.sh | bash
#   curl -fsSL <base>/ubuntu-clash/unix/uninstall.sh | bash -s -- --prefix "$HOME/.local"
#
# 删除已安装的命令与 Bash/Zsh 补全, 并清理 shell 配置中的 uclash 标记段。
# 不会删除 mihomo 核心或用户数据; 默认保留通用的 zsh 共享补全片段。
set -euo pipefail

# Zsh 下对齐 Bash 语义: 参数分词与空 glob 处理; Bash 不受影响。
if [ -n "${ZSH_VERSION:-}" ]; then
  setopt shwordsplit nullglob
fi

APP=uclash

# 旧系统级路径可由环境变量覆盖, 便于自定义系统前缀与隔离测试。
LEGACY_SYSTEM_PREFIX="${UCLASH_SYSTEM_PREFIX:-/usr/local}"
SYSTEM_SHARE="${UCLASH_SYSTEM_SHARE:-/usr/share}"

MARK_BEGIN="# >>> uclash >>>"
MARK_END="# <<< uclash <<<"
LEGACY_MARK_BEGIN="# >>> clashctl >>>"
LEGACY_MARK_END="# <<< clashctl <<<"
SHARED_MARK_BEGIN="# >>> zsh user completions >>>"
SHARED_MARK_END="# <<< zsh user completions <<<"

PREFIX="${PREFIX:-$HOME/.local}"
REMOVE_ZSH_BLOCK=0

usage() {
  cat <<EOF
用法: curl -fsSL <base>/ubuntu-clash/unix/uninstall.sh | bash -s -- [选项]

删除已安装的 uclash 命令与其 Bash/Zsh 补全。
不会删除 mihomo 核心或用户数据。

选项:
  --prefix DIR         安装时使用的前缀 (默认: \$HOME/.local)
  --remove-zsh-block   同时删除 rc 文件中的通用 zsh 共享补全片段
                       (注意: 该片段可能被其他工具复用, 慎用)
  -h, --help           显示本帮助
EOF
}

while [ $# -gt 0 ]; do
  case "$1" in
    --prefix)           shift; PREFIX="${1:-}" ;;
    --prefix=*)         PREFIX="${1#*=}" ;;
    --remove-zsh-block) REMOVE_ZSH_BLOCK=1 ;;
    -h|--help)          usage; exit 0 ;;
    *)                  printf '未知参数: %s\n' "$1" >&2; usage >&2; exit 1 ;;
  esac
  shift
done

[ -n "$PREFIX" ] || { printf '安装前缀不能为空 (--prefix)\n' >&2; exit 1; }

TARGET_USER="${UCLASH_USER:-${CLASHCTL_USER:-${SUDO_USER:-}}}"
[ -n "$TARGET_USER" ] || TARGET_USER="$(id -un)"

BASE_HOME="$(getent passwd "$TARGET_USER" 2>/dev/null | cut -d: -f6 || true)"
[ -n "$BASE_HOME" ] || BASE_HOME="$HOME"

BIN_DIR="$PREFIX/bin"
BIN="$BIN_DIR/$APP"
STATE_DIR="${UCLASH_STATE_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/uclash}"
MANIFEST_FILE="$STATE_DIR/files.list"
BASHRC="$BASE_HOME/.bashrc"
ZSHRC="$BASE_HOME/.zshrc"
ZSH_FUNC_DIR="$BASE_HOME/.zfunc"
BASH_COMP_DIR="${XDG_DATA_HOME:-$BASE_HOME/.local/share}/bash-completion/completions"
CONFIG_DIR="${XDG_CONFIG_HOME:-$BASE_HOME/.config}/uclash"
CONFIG_FILE="$CONFIG_DIR/config"

remove_block() {
  local rc="$1"
  [ -n "$rc" ] && [ -f "$rc" ] || return 0
  grep -qF "$MARK_BEGIN" "$rc"        && sed -i "\|$MARK_BEGIN|,\|$MARK_END|d" "$rc"
  grep -qF "$LEGACY_MARK_BEGIN" "$rc" && sed -i "\|$LEGACY_MARK_BEGIN|,\|$LEGACY_MARK_END|d" "$rc"
  return 0
}

remove_shared_block() {
  local rc="$1"
  [ -n "$rc" ] && [ -f "$rc" ] || return 0
  if ! grep -qF "$SHARED_MARK_BEGIN" "$rc"; then
    printf '未找到通用 zsh 共享补全片段: %s\n' "$rc"
    return 0
  fi
  awk -v b="$SHARED_MARK_BEGIN" -v e="$SHARED_MARK_END" '
    $0 == b { skip = 1; next }
    $0 == e { skip = 0; next }
    !skip { print }
  ' "$rc" > "$rc.uclash.tmp" && mv "$rc.uclash.tmp" "$rc"
  printf '已移除通用 zsh 共享补全片段: %s\n' "$rc"
}

remove_manifest_files() {
  [ -f "$MANIFEST_FILE" ] || return 0
  local f
  while IFS= read -r f; do
    [ -n "$f" ] || continue
    rm -f "$f"
  done < "$MANIFEST_FILE"
  rm -f "$MANIFEST_FILE"
  return 0
}

remove_privileged_file() {
  local f="$1"
  if [ -w "$(dirname "$f")" ]; then
    rm -f "$f"
  elif [ -e "$f" ]; then
    printf '提示: 检测到旧文件需更高权限清理: %s\n' "$f" >&2
  fi
  return 0
}

if [ -x "$BIN" ]; then
  printf '卸载已安装命令: %s\n' "$BIN"
else
  printf '未找到: %s\n' "$BIN"
fi
rm -f "$BIN"
rm -f "$BIN_DIR/$APP".bak.*
rm -f "$BASH_COMP_DIR/$APP" "$ZSH_FUNC_DIR/_$APP"
remove_manifest_files
rm -f "$CONFIG_FILE"
rmdir "$CONFIG_DIR" 2>/dev/null || true
rm -f "$STATE_DIR/version"
rmdir "$STATE_DIR" 2>/dev/null || true

# 迁移清理: 旧路径补全与旧 clashctl 文件。
rm -f "$BIN_DIR/clashctl"
rm -f "$BASE_HOME/.local/share/zsh/site-functions/_$APP" "$BASE_HOME/.local/share/zsh/site-functions/_clashctl"
remove_privileged_file "$LEGACY_SYSTEM_PREFIX/share/zsh/site-functions/_$APP"
remove_privileged_file "$LEGACY_SYSTEM_PREFIX/share/zsh/site-functions/_clashctl"
remove_privileged_file "$SYSTEM_SHARE/bash-completion/completions/$APP"
remove_privileged_file "$SYSTEM_SHARE/bash-completion/completions/clashctl"

for rc in "$BASHRC" "$ZSHRC"; do
  if [ -n "$rc" ] && [ -f "$rc" ] && { grep -qF "$MARK_BEGIN" "$rc" || grep -qF "$LEGACY_MARK_BEGIN" "$rc"; }; then
    remove_block "$rc"
    printf '已清理 shell 配置: %s\n' "$rc"
  fi
done

if [ "$REMOVE_ZSH_BLOCK" -eq 1 ]; then
  remove_shared_block "$ZSHRC"
else
  printf '保留通用 zsh 共享补全片段: %s (如需移除请加 --remove-zsh-block)\n' "$ZSHRC"
fi

cat <<EOF

卸载完成: $BIN
mihomo 核心与用户数据未删除; 如需清理请手动处理:
  核心 (--user 安装): $STATE_DIR/bin
  状态目录:           $STATE_DIR
EOF
