#!/bin/sh
# ZCode Pro 启动器（Linux / macOS）
# 优先用 ZCode 自带的 Node 运行时（ELECTRON_RUN_AS_NODE），无需安装 Node.js。
set -e

# 解析符号链接得到脚本真实路径（如 /usr/bin/zcode-pro → /usr/lib/zcode-pro/bin/zcode-pro），
# 否则经 symlink 调用时 $0 目录不是安装目录，找不到 cli.mjs。
# readlink -f 不是 POSIX（旧 macOS/BSD 没有），解析不了就逐级跟符号链接；
# 连 readlink 都没有时保持原路径（与旧行为一致）
SELF=$0
_zp_n=0
while [ -L "$SELF" ]; do
  # 符号链接成环（如 A→B→A）时靠次数上限退出，避免死循环
  _zp_n=$((_zp_n + 1))
  [ "$_zp_n" -le 40 ] || break
  _zp_link=$(readlink -- "$SELF" 2>/dev/null) || break
  case "$_zp_link" in
    /*) SELF=$_zp_link ;;
    *) SELF=$(dirname -- "$SELF")/$_zp_link ;;
  esac
done
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$SELF")" && pwd)
APP_DIR=$(dirname -- "$SCRIPT_DIR")
ENTRY="$APP_DIR/cli.mjs"

# 系统级安装（AUR / PREFIX=/opt）时提醒清理 ~/.local 下的手动安装残留：
# 残留的同名快捷方式优先级更高、~/.local/bin 在 PATH 更靠前，会让菜单与终端一直运行旧版。
case "$APP_DIR" in
  "$HOME"/*) ;;  # 自身就是手动安装（默认装在 ~/.local），无需提醒
  *)
    if [ -e "$HOME/.local/share/zcode-pro" ] || [ -e "$HOME/.local/bin/zcode-pro" ] \
       || [ -e "$HOME/.local/share/applications/zcode-pro.desktop" ]; then
      echo "[zcodepro] 检测到 ~/.local 下有旧版手动安装残留，可能遮蔽本命令与快捷方式（表现为一直运行旧版）。" >&2
      echo "  清理：rm -f ~/.local/bin/zcode-pro ~/.local/share/applications/zcode-pro.desktop && rm -rf ~/.local/share/zcode-pro" >&2
    fi
    ;;
esac

find_zcode_binary() {
  if [ -n "$ZCODEPRO_ZCODE_PATH" ] && [ -x "$ZCODEPRO_ZCODE_PATH" ]; then
    printf '%s' "$ZCODEPRO_ZCODE_PATH"
    return 0
  fi
  for c in /opt/ZCode/zcode /usr/lib/zcode/zcode /usr/share/zcode/zcode /usr/local/ZCode/zcode \
           "/Applications/ZCode.app/Contents/MacOS/ZCode" "$HOME/Applications/ZCode.app/Contents/MacOS/ZCode"; do
    if [ -x "$c" ]; then
      printf '%s' "$c"
      return 0
    fi
  done
  return 1
}

# 优先用 ZCode 内置的 Node 运行时（版本恒与 ZCode 匹配，含 node:sqlite/全局 WebSocket），
# 避免系统 node 过旧（<22.5 缺 node:sqlite、<22 缺全局 WebSocket）时启动失败；
# 找不到 ZCode 可执行文件、或运行时预检跑不起来时退回系统 node。
ZCODE_BIN=$(find_zcode_binary) || ZCODE_BIN=
# 运行时预检（与 zcode-pro.cmd、zcode_pro/cli.py 同款）：PATH 等来源找到的可执行
# 文件可能不完整（缺 resources/ICU 数据等），以 Node 模式跑不起来就回退系统 node
if [ -n "$ZCODE_BIN" ]; then
  ELECTRON_RUN_AS_NODE=1 "$ZCODE_BIN" -e "process.exit(0)" >/dev/null 2>&1 || ZCODE_BIN=
fi
if [ -z "$ZCODE_BIN" ]; then
  if command -v node >/dev/null 2>&1; then
    exec node --no-warnings "$ENTRY" "$@"
  fi
  echo "[zcodepro] 未找到 node，也未找到 ZCode 可执行文件。请安装 Node.js >= 22 或设置 ZCODEPRO_ZCODE_PATH。" >&2
  exit 1
fi
# 用 ZCode 内置的 Node 运行时执行启动器（ELECTRON_RUN_AS_NODE 使其表现为纯 Node）
ELECTRON_RUN_AS_NODE=1 exec "$ZCODE_BIN" --no-warnings "$ENTRY" "$@"
