#!/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。
SELF=$(readlink -f -- "$0" 2>/dev/null || printf '%s' "$0")
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) || {
  if command -v node >/dev/null 2>&1; then
    exec node "$ENTRY" "$@"
  fi
  echo "[zcodepro] 未找到 node，也未找到 ZCode 可执行文件。请安装 Node.js >= 22 或设置 ZCODEPRO_ZCODE_PATH。" >&2
  exit 1
}
# 用 ZCode 内置的 Node 运行时执行启动器（ELECTRON_RUN_AS_NODE 使其表现为纯 Node）
ELECTRON_RUN_AS_NODE=1 exec "$ZCODE_BIN" "$ENTRY" "$@"
