#!/usr/bin/env bash
# iPet agent 集成安装器 —— 幂等，可反复执行。
#   curl -fsSL https://ipet.infinityfly.xin/agent/install.sh | bash -s -- --agent codex
set -euo pipefail

GATEWAY="https://ipet.infinityfly.xin"
AGENT="generic"
PLUGIN=0
PROFILE=""
SKILL_DIR=""
MCP_CONFIG=""
EMAIL=""
PASSWORD=""
API_KEY="${IPET_API_KEY:-}"
SKIP_AUTH=0
DRY=0
NO_LINK=0

while [ $# -gt 0 ]; do
  case "$1" in
    --agent) AGENT="${2:-generic}"; shift 2 ;;
    --agent=*) AGENT="${1#*=}"; shift ;;
    --skill-dir) SKILL_DIR="${2:-}"; shift 2 ;;
    --mcp-config) MCP_CONFIG="${2:-}"; shift 2 ;;
    --email) EMAIL="${2:-}"; shift 2 ;;
    --password) PASSWORD="${2:-}"; shift 2 ;;
    --key) API_KEY="${2:-}"; shift 2 ;;
    --skip-auth) SKIP_AUTH=1; shift ;;
    --plugin) PLUGIN=1; shift ;;
    --profile) PROFILE="${2:-}"; shift 2 ;;
    --profile=*) PROFILE="${1#*=}"; shift ;;
    --dry-run) DRY=1; shift ;;
    --no-link) NO_LINK=1; shift ;;
    -h|--help)
      cat <<'USAGE'
iPet agent 集成安装器
  --agent codex|claude|qoder|dsh|generic
                            目标宿主（决定 skill 与 mcp 配置落点）
  --plugin                  装成宿主原生插件（marketplace / dsh bundle），而不是手抄 MCP 配置
  --profile NAME            dsh 插件要写进的 profile（dsh plugin --profile）
  --email / --password                 登录后自动生成 agent:hub 作用域 api key
  --key ipet-...                       直接用已有 key
  --skill-dir DIR                      自定义 skill 目录
  --mcp-config FILE                    自定义 mcp 配置文件
  --skip-auth                          不写凭证（稍后用 ipet login）
  --dry-run                            只说明要做什么，不改磁盘
USAGE
      exit 0 ;;
    *) echo "未知参数：$1（--help 看用法）" >&2; exit 2 ;;
  esac
done

if ! command -v node >/dev/null 2>&1; then
  echo "缺少依赖：node（>=18，需要内置 fetch）" >&2
  exit 1
fi
NODE_MAJOR="$(node -p 'process.versions.node.split(".")[0]' 2>/dev/null || echo 0)"
if [ "${NODE_MAJOR}" -lt 18 ]; then
  echo "node 版本过旧：${NODE_MAJOR} < 18" >&2
  exit 1
fi

IPET_HOME="${IPET_HOME:-$HOME/.ipet}"
BIN="${IPET_HOME}/bin"
say() { printf '\033[36m==>\033[0m %s\n' "$*"; }

say "下载 CLI（${GATEWAY}）"
[ "${DRY}" = 1 ] || mkdir -p "${BIN}"
for f in ipetctl.mjs ipet-mcp.mjs; do
  if [ "${DRY}" = 1 ]; then
    echo "  [dry-run] curl ${GATEWAY}/agent/cli/${f} -> ${BIN}/${f}"
    continue
  fi
  curl -fsSL "${GATEWAY}/agent/cli/${f}" -o "${BIN}/${f}" || { echo "下载 ${f} 失败" >&2; exit 1; }
  chmod 0755 "${BIN}/${f}"
done

CTL_ARGS=()
[ -n "${SKILL_DIR}" ] && CTL_ARGS+=(--skill-dir "${SKILL_DIR}")
[ -n "${MCP_CONFIG}" ] && CTL_ARGS+=(--mcp-config "${MCP_CONFIG}")
[ "${NO_LINK}" = 1 ] && CTL_ARGS+=(--no-link)

if [ -n "${API_KEY}" ] || { [ -n "${EMAIL}" ] && [ -n "${PASSWORD}" ]; }; then
  say "写入凭证"
  if [ -n "${API_KEY}" ]; then
    [ "${DRY}" = 1 ] || node "${BIN}/ipetctl.mjs" login --key "${API_KEY}" --gateway "${GATEWAY}"
  else
    [ "${DRY}" = 1 ] || node "${BIN}/ipetctl.mjs" login --gateway "${GATEWAY}" --email "${EMAIL}" --password "${PASSWORD}"
  fi
elif [ "${SKIP_AUTH}" != 1 ]; then
  say "未提供凭证 —— 稍后执行：node ${BIN}/ipetctl.mjs login --email 你的邮箱"
fi

# 插件形态自带 skill + MCP（清单里就带），不能再写一份手搓配置：
# 同一宿主里出现两台同名 ipet 服务器，后注册的那台会直接加载失败。
if [ "${PLUGIN}" != 1 ]; then
  say "安装 skill + 配置 MCP（agent=${AGENT}）"
  if [ "${DRY}" = 1 ]; then
    echo "  [dry-run] node ${BIN}/ipetctl.mjs install --agent ${AGENT} ${CTL_ARGS[*]:-}"
  else
    node "${BIN}/ipetctl.mjs" install --agent "${AGENT}" --skip-auth-check "${CTL_ARGS[@]:-}"
  fi
fi

if [ "${PLUGIN}" = 1 ]; then
  case "${AGENT}" in
    codex|claude|dsh) PLUGIN_HOST="${AGENT}" ;;
    *) PLUGIN_HOST="auto" ;;
  esac
  say "装成 ${PLUGIN_HOST} 的原生插件"
  PARGS=(plugin install --host "${PLUGIN_HOST}")
  [ -n "${PROFILE}" ] && PARGS+=(--profile "${PROFILE}")
  # --plugin 跳过了传统步骤，所以这里要自己把 ipet 命令软链补上。
  if [ "${NO_LINK}" = 1 ]; then PARGS+=(--no-link); fi
  if [ "${DRY}" = 1 ]; then
    echo "  [dry-run] node ${BIN}/ipetctl.mjs ${PARGS[*]}"
  else
    node "${BIN}/ipetctl.mjs" "${PARGS[@]}"
  fi
fi

say "自检能力清单"
if [ "${DRY}" = 1 ]; then
  echo "  [dry-run] node ${BIN}/ipetctl.mjs tools"
else
  node "${BIN}/ipetctl.mjs" tools 2>/dev/null | sed -n '1,14p' || echo "（还没登录，tools 暂不可用）"
fi

DONE_TEXT="装好了。共 22 个能力可用："
if [ "${PLUGIN}" = 1 ]; then
  DONE_TEXT="$DONE_TEXT
  插件形态已注册进 ${AGENT}（版本/启停/卸载交给宿主自己的 plugin 命令）"
else
  DONE_TEXT="$DONE_TEXT
  想要宿主原生插件形态（marketplace / bundle，版本与卸载交给宿主）：
     curl -fsSL ${GATEWAY}/agent/install.sh | bash -s -- --agent ${AGENT} --plugin"
fi

cat <<DONE

$DONE_TEXT
  1) MCP   —— 重开 ${AGENT} 会话就能看到 ipet.* 工具
  2) Skill —— ipet/SKILL.md 已落到宿主的技能目录
  3) CLI   —— node ${BIN}/ipetctl.mjs say "你好"

让远程网关能把任务打回这台机器执行：
  node ${BIN}/ipetctl.mjs connect --executor "claude -p {prompt}"
DONE
