#!/bin/zsh

set -u
setopt null_glob

echo "========================================"
echo "移除威注音／唯音 vChewing"
echo "保留：小麥注音 McBopomofo、ABC"
echo "========================================"
echo
read "answer?確定繼續嗎？輸入 y 後按 Enter："

if [[ "$answer" != "y" && "$answer" != "Y" ]]; then
    echo "已取消，沒有修改任何檔案。"
    exit 0
fi

STAMP="$(date +%Y%m%d-%H%M%S)"
BACKUP="$HOME/Desktop/vChewing備份-$STAMP"

mkdir -p "$BACKUP/使用者檔案"
mkdir -p "$BACKUP/系統檔案"

LSREGISTER="/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"

backup_remove_user() {
    local source="$1"

    if [[ -e "$source" ]]; then
        local safe_name="${source//\//_}"

        echo "移除使用者檔案：$source"
        /usr/bin/ditto "$source" "$BACKUP/使用者檔案/$safe_name"
        /bin/rm -rf "$source"
    fi
}

backup_remove_system() {
    local source="$1"

    if [[ -e "$source" ]]; then
        local safe_name="${source//\//_}"

        echo "移除系統檔案：$source"
        sudo /usr/bin/ditto "$source" "$BACKUP/系統檔案/$safe_name"
        sudo /bin/rm -rf "$source"
    fi
}

echo
echo "正在停止威注音……"

/usr/bin/pkill -x vChewing 2>/dev/null || true
/usr/bin/pkill -f "/vChewing.app/" 2>/dev/null || true

echo
echo "正在尋找威注音程式……"

# 使用者層級的輸入法
for app in "$HOME/Library/Input Methods"/*.app; do
    plist="$app/Contents/Info.plist"
    bundle_id=""

    if [[ -f "$plist" ]]; then
        bundle_id=$(/usr/libexec/PlistBuddy \
            -c "Print :CFBundleIdentifier" "$plist" 2>/dev/null || true)
    fi

    if [[ "$bundle_id" == *"vChewing"* ||
          "$bundle_id" == *"atelierInmu"* ||
          "$app" == *"vChewing"* ||
          "$app" == *"威注音"* ||
          "$app" == *"唯音"* ]]; then

        [[ -x "$LSREGISTER" ]] &&
            "$LSREGISTER" -u "$app" >/dev/null 2>&1 || true

        backup_remove_user "$app"
    fi
done

# 系統層級的輸入法
for app in /Library/Input\ Methods/*.app; do
    plist="$app/Contents/Info.plist"
    bundle_id=""

    if [[ -f "$plist" ]]; then
        bundle_id=$(/usr/libexec/PlistBuddy \
            -c "Print :CFBundleIdentifier" "$plist" 2>/dev/null || true)
    fi

    if [[ "$bundle_id" == *"vChewing"* ||
          "$bundle_id" == *"atelierInmu"* ||
          "$app" == *"vChewing"* ||
          "$app" == *"威注音"* ||
          "$app" == *"唯音"* ]]; then

        [[ -x "$LSREGISTER" ]] &&
            "$LSREGISTER" -u "$app" >/dev/null 2>&1 || true

        backup_remove_system "$app"
    fi
done

echo
echo "正在清除威注音的鍵盤配置……"

# 使用者鍵盤配置
for item in \
    "$HOME/Library/Keyboard Layouts"/vChewing* \
    "$HOME/Library/Keyboard Layouts"/"*威注音*" \
    "$HOME/Library/Keyboard Layouts"/"*唯音*"; do

    backup_remove_user "$item"
done

# 系統鍵盤配置
for item in \
    /Library/Keyboard\ Layouts/vChewing* \
    /Library/Keyboard\ Layouts/"*威注音*" \
    /Library/Keyboard\ Layouts/"*唯音*"; do

    backup_remove_system "$item"
done

# 舊版安裝收據
for item in /Library/Receipts/org.atelierInmu.vChewing*; do
    backup_remove_system "$item"
done

# 威注音偏好設定
for item in \
    "$HOME/Library/Preferences"/org.atelierInmu.vChewing*.plist \
    "$HOME/Library/Preferences"/org.vChewing*.plist; do

    backup_remove_user "$item"
done

echo
echo "正在重新整理輸入法選單……"

/usr/bin/killall cfprefsd 2>/dev/null || true
/usr/bin/killall TextInputMenuAgent 2>/dev/null || true
/usr/bin/killall SystemUIServer 2>/dev/null || true

echo
echo "========================================"
echo "威注音／唯音已移除。"
echo "小麥注音與 ABC 未被修改。"
echo
echo "備份位置："
echo "$BACKUP"
echo
echo "請登出 macOS 後重新登入，"
echo "或直接重新啟動電腦。"
echo "========================================"
