#!/bin/sh
# ============================================================
# 奇乐 install.sh · M1（F8 §1.3/§6；curl|sh 码直通 R1-4）
# 用法：curl -fsSL https://agnet8.com/dl/install.sh | sh -s -- QLD-XXXX-XXXX-XXXX
#   环境变量：QILE_SERVER（默认 https://agnet8.com）
#             QILE_SKIP_BROWSER=1（跳过 chromium 下载，复用已有缓存）
# 信任锚（TOFU 三件，F8 R4-15）：①本脚本仅经 https 下发 ②zip SHA-256
#   公示于安装页/控制台并与本脚本内嵌值双对 ③GitHub Release 同 hash 旁证
# 设计护栏：环境不满足即终止且零下载；每步可幂等重跑。
# ============================================================
set -eu

CODE="${1:-}"
SERVER="${QILE_SERVER:-https://agnet8.com}"
ZIP_NAME="qile-shell-m1-20261110.zip"
ZIP_SHA256="d26265810a22d292ff690aa0ac2ab6bd93b1d17bda2043704ed3e12496174992"
QILE="$HOME/.qile"

say()  { printf '\033[1;32m▸\033[0m %s\n' "$*"; }
fail() { printf '\033[1;31m✗ %s\033[0m\n' "$*" >&2; exit 1; }

[ -n "$CODE" ] || fail "缺少许可码参数。用法：curl -fsSL $SERVER/dl/install.sh | sh -s -- QLD-XXXX-XXXX-XXXX"
case "$CODE" in QLD-????-????-????) ;; *) fail "许可码格式应为 QLD-XXXX-XXXX-XXXX（收到：$CODE）";; esac

# ---- ① 环境探测（不满足即终止，零下载）----
say "① 环境探测"
[ "$(uname -s)" = "Darwin" ] || fail "v1 仅支持 macOS（Windows 随 M2 提供 install.ps1）"
[ "$(uname -m)" = "arm64" ] || fail "v1 仅支持 Apple Silicon（arm64），当前 $(uname -m)"
DISK_MB=$(df -m "$HOME" | awk 'NR==2 {print $4}')
[ "${DISK_MB:-0}" -ge 1024 ] || fail "磁盘剩余不足 1GB（当前 ${DISK_MB:-?}MB）"
[ -d "/System/Library/CoreServices" ] || fail "未检测到 GUI 桌面会话（Skill 需有头浏览器扫码登录）"
say "   macOS arm64 · 磁盘 ${DISK_MB}MB · GUI 会话 ✓"

# ---- ② 下载壳包 + SHA-256 校验（TOFU 锚点②）----
say "② 下载壳包 $ZIP_NAME"
mkdir -p "$QILE"
cd "$QILE"
if [ ! -f "$ZIP_NAME" ] || [ "$(shasum -a 256 "$ZIP_NAME" | cut -d' ' -f1)" != "$ZIP_SHA256" ]; then
  curl -fSL --progress-bar "$SERVER/dl/$ZIP_NAME" -o "$ZIP_NAME" \
    || curl -fSL --progress-bar "https://qile.ai/dl/$ZIP_NAME" -o "$ZIP_NAME" \
    || fail "下载失败（$SERVER 与 qile.ai 双域名均不可达）"
fi
GOT="$(shasum -a 256 "$ZIP_NAME" | cut -d' ' -f1)"
[ "$GOT" = "$ZIP_SHA256" ] || fail "SHA-256 校验失败（期望 ${ZIP_SHA256:0:16}… 实得 ${GOT:0:16}…）——请勿继续，上报客服"
say "   SHA-256 ✓ ${GOT:0:16}…"

# ---- ③ 解包 ----
say "③ 解包到 ${QILE}（幂等：已存在先清旧壳）"
rm -rf "$QILE/client" "$QILE/executor" "$QILE/skills"
unzip -qo "$ZIP_NAME" -d "$QILE"
[ -f "$QILE/executor/qile_exec.py" ] || fail "壳包结构异常（缺 executor/qile_exec.py）"

# ---- ③b 安装 SKILL（F8.2 ①：~/.agents/skills/qile/——内容边界 F8.1，
#      只含编排说明无任何 flow/密钥；缺省不致命=skill 发现是软依赖） ----
if [ -f "$QILE/skills/qile/SKILL.md" ]; then
  say "③b 安装 SKILL（~/.agents/skills/qile/）"
  mkdir -p "$HOME/.agents/skills/qile"
  cp "$QILE/skills/qile/SKILL.md" "$HOME/.agents/skills/qile/SKILL.md"
else
  say "③b 壳包未含 SKILL.md——跳过（skill 发现为软依赖，功能不损）"
fi

# ---- ④ Python ≥3.10（源码态；冻结单文件随 F8 M1 末段替换本分支）----
say "④ 运行时"
PY=""
for c in python3 /usr/bin/python3 "$QILE/bin/python3"; do
  if command -v "$c" >/dev/null 2>&1; then
    V=$("$c" -c 'import sys;print("%d%d"%sys.version_info[:2])' 2>/dev/null || echo 0)
    [ "${V:-0}" -ge 310 ] 2>/dev/null && { PY="$c"; break; }
  fi
done
if [ -z "$PY" ]; then
  fail "需要 Python ≥3.10（未找到可用解释器）。请先安装 Xcode Command Line Tools：xcode-select --install 后重跑"
fi
say "   $PY ($($PY --version 2>&1))"

# ---- ⑤ 依赖（playwright；SKIP 可跳过）----
say "⑤ 依赖安装（playwright）"
if [ "${QILE_SKIP_BROWSER:-0}" != "1" ]; then
  "$PY" -m pip install --quiet --user "playwright==1.64.1" 2>/dev/null \
    || "$PY" -m pip install --quiet --break-system-packages --user "playwright==1.64.1" \
    || fail "playwright 安装失败（网络/权限）——重试或设置 QILE_SKIP_BROWSER=1"
  if ! ls "$HOME/Library/Caches/ms-playwright"/chromium-* >/dev/null 2>&1 \
     && ! ls "$QILE/ms-playwright"/chromium-* >/dev/null 2>&1; then
    say "   下载 chromium（约 366MB，仅一次）"
    "$PY" -m playwright install chromium || fail "chromium 下载失败——重跑安装器即可续传"
  fi
else
  say "   QILE_SKIP_BROWSER=1 跳过（复用已有缓存）"
fi

# ---- ⑥ 注册 MCP（ZCode 用户级 ~/.zcode/cli/config.json）----
say "⑥ 注册 MCP"
"$PY" "$QILE/client/qilectl/qilectl.py" repair-mcp \
  --exec-cmd "$PY $QILE/client/qile-mcp/qile_mcp.py"

# ---- ⑦ 激活（码直通非交互，R1-4）----
say "⑦ 激活许可"
"$PY" "$QILE/client/qilectl/qilectl.py" activate --code "$CODE" --server "$SERVER"

# ---- ⑧ 自检 + 脱敏诊断包 ----
say "⑧ 自检"
"$PY" "$QILE/client/qilectl/qilectl.py" diagnose --profile full --report || true

printf '\n\033[1m安装完成。\033[0m 对你的 AI 助手说：「用奇乐发布一条内容」即可开始。\n'
