#!/bin/bash
#
# Zed 一鍵設定（macOS）
# 說明：https://oawu.tw/blog/macos/zed/
#
# 用法：
#   curl -fsSL -o /tmp/zed-install.sh https://oawu.tw/blog/macos/zed/files/install.sh
#   bash /tmp/zed-install.sh
#
# ── 會做的事 ─────────────────────────────────────
#   1. 安裝 /Applications/Zed.app（從 zed.dev 下載 DMG，不需要 Homebrew；已安裝則略過）
#   2. 安裝 Hack 字型到 ~/Library/Fonts/（已安裝則略過）
#   3. 下載 settings.json、keymap.json 到 ~/.config/zed/
#   4. 建立 ~/bin/zed，並在 ~/.zshrc 結尾加一行 PATH（已有則略過）
#
#   設定檔內容不同時，舊檔先改名成 *.bak.<時間> 再覆蓋，不會直接蓋掉。
#   Zed 會自動重載設定，不需要重新啟動。
#
# ── 需要人工的步驟 ───────────────────────────────
#   無。
#
# ── 結束代碼 ─────────────────────────────────────
#   0  完成
#   1  失敗（下載失敗等），訊息會說明原因
#
# ── 可重複執行 ───────────────────────────────────
#   已完成的步驟會略過，重跑是安全的。
#
# ── 其他 ─────────────────────────────────────────
#   設定檔從 BASE_URL 下載。測試時可用環境變數指到別處，例如本機的開發伺服器：
#     BASE_URL=http://localhost:4321/blog/macos/zed/files bash install.sh
#

set -euo pipefail

BASE_URL="${BASE_URL:-https://oawu.tw/blog/macos/zed/files}"

APP="/Applications/Zed.app"
CONFIG_DIR="$HOME/.config/zed"
BIN_DIR="$HOME/bin"
ZSHRC="$HOME/.zshrc"
PATH_LINE='export PATH="$PATH:$HOME/bin"'

TMP_DIR="$(mktemp -d)"
MOUNT=""
cleanup() {
  [ -n "$MOUNT" ] && hdiutil detach -quiet "$MOUNT" >/dev/null 2>&1 || true
  rm -rf "$TMP_DIR"
}
trap cleanup EXIT

# 沒有終端機（例如由其他程式代為執行）時不上色，輸出才不會夾雜控制碼
if [ -t 1 ]; then
  BOLD=$'\033[1m' BLUE=$'\033[1;34m' GREEN=$'\033[32m' GRAY=$'\033[90m' YELLOW=$'\033[33m' RED=$'\033[31m' RESET=$'\033[0m'
else
  BOLD='' BLUE='' GREEN='' GRAY='' YELLOW='' RED='' RESET=''
fi
# 下載進度條同理，沒有終端機時改成安靜模式（錯誤訊息仍會顯示）
if [ -t 2 ]; then PROGRESS='-#'; else PROGRESS='-sS'; fi
step() { printf '\n%s==>%s %s%s%s\n' "$BLUE" "$RESET" "$BOLD" "$1" "$RESET"; }
ok()   { printf '    %s✔%s %s\n' "$GREEN" "$RESET" "$1"; }
skip() { printf '    %s- %s%s\n' "$GRAY" "$1" "$RESET"; }
warn() { printf '    %s!%s %s\n' "$YELLOW" "$RESET" "$1"; }
fail() { printf '\n%s✘ %s%s\n' "$RED" "$1" "$RESET" >&2; exit 1; }

# 從 BASE_URL 下載設定檔，輸出暫存檔路徑
fetch() {
  local name="$1" out="$TMP_DIR/$1"
  curl -fsSL "$BASE_URL/$(printf '%s' "$name" | sed 's/ /%20/g')" -o "$out" || fail "下載失敗：$BASE_URL/$name"
  printf '%s' "$out"
}

# 放置檔案：內容相同就略過，不同則先備份再覆蓋
place() {
  local src="$1" dest="$2" label
  label="$(basename "$dest")"
  if [ -f "$dest" ] && cmp -s "$src" "$dest"; then
    skip "$label 已是最新"
    return
  fi
  if [ -f "$dest" ]; then
    local bak="$dest.bak.$(date +%Y%m%d%H%M%S)"
    mv "$dest" "$bak"
    warn "已備份舊檔：$(basename "$bak")"
  fi
  cp "$src" "$dest"
  ok "$label"
}

[ "$(uname)" = "Darwin" ] || fail "此腳本只支援 macOS"

# 1. 安裝 Zed
step "安裝 Zed"
if [ -d "$APP" ]; then
  skip "已安裝"
else
  case "$(uname -m)" in
    arm64) arch="aarch64" ;;
    *)     arch="x86_64" ;;
  esac
  curl -fL "$PROGRESS" "https://zed.dev/api/releases/stable/latest/Zed-$arch.dmg" -o "$TMP_DIR/zed.dmg"
  MOUNT="$TMP_DIR/mnt"
  mkdir -p "$MOUNT"
  hdiutil attach -quiet -nobrowse -readonly -mountpoint "$MOUNT" "$TMP_DIR/zed.dmg"
  ditto "$MOUNT/Zed.app" "$APP"
  hdiutil detach -quiet "$MOUNT"
  MOUNT=""
  ok "Zed"
fi

# 2. Hack 字型（settings.json 使用）
step "安裝 Hack 字型"
if [ -f "$HOME/Library/Fonts/Hack-Regular.ttf" ] || [ -f /Library/Fonts/Hack-Regular.ttf ]; then
  skip "已安裝"
else
  curl -fL "$PROGRESS" https://github.com/source-foundry/Hack/releases/latest/download/Hack-v3.003-ttf.zip -o "$TMP_DIR/hack.zip"
  ditto -x -k "$TMP_DIR/hack.zip" "$TMP_DIR/hack"
  mkdir -p "$HOME/Library/Fonts"
  find "$TMP_DIR/hack" -name '*.ttf' -exec cp {} "$HOME/Library/Fonts/" \;
  ok "Hack"
fi

# 3. 設定檔（Zed 會自動重載，不需重啟）
step "設定 settings.json、keymap.json"
mkdir -p "$CONFIG_DIR"
f="$(fetch "settings.json")"
place "$f" "$CONFIG_DIR/settings.json"
f="$(fetch "keymap.json")"
place "$f" "$CONFIG_DIR/keymap.json"

# 4. 命令列 zed
step "設定 zed 指令"
mkdir -p "$BIN_DIR"
ln -sfn "$APP/Contents/MacOS/cli" "$BIN_DIR/zed"
ok "$BIN_DIR/zed"
touch "$ZSHRC"
if grep -qxF "$PATH_LINE" "$ZSHRC"; then
  skip "~/.zshrc 已包含 ~/bin"
else
  printf '\n# My bin files\n%s\n' "$PATH_LINE" >> "$ZSHRC"
  ok "~/.zshrc 加入 ~/bin"
fi

step "完成！"
echo "    新開終端機分頁後即可使用 zed 指令"
