#!/usr/bin/env sh
#
# 邱懿武 Skill Hub · 一行命令安装器
# Repository: https://skill.qiuyiwu.com
# Spec:       https://skill.qiuyiwu.com/install/skill-hub.md
#
# 用法：
#   curl -fsSL https://skill.qiuyiwu.com/install.sh | sh -s <skill-slug>
#   curl -fsSL https://skill.qiuyiwu.com/install.sh | sh -s -- --no-skills
#   curl -fsSL https://skill.qiuyiwu.com/install.sh | sh -s -- --with-cli <slug>
#
# Flags:
#   --no-skills    只装 CLI shim，不下载任何 skill
#   --no-cli       只装指定 skill，不装 CLI
#   --with-cli     同时装 CLI shim 和指定 skill（等价于先 --no-skills 再 sh -s <slug>）
#   -h, --help     帮助
#
# Env:
#   CLAUDE_SKILLS_DIR  自定义 skill 安装目录（默认 $HOME/.claude/skills）
#   SKILL_HUB_URL      自定义 hub URL（默认 https://skill.qiuyiwu.com）

set -e

HUB="${SKILL_HUB_URL:-https://skill.qiuyiwu.com}"
DEST="${CLAUDE_SKILLS_DIR:-$HOME/.claude/skills}"
CLI_DIR="${SKILL_HUB_CLI_DIR:-$HOME/.local/bin}"
CLI_NAME="skill-hub"

# ── colors ──
color() { printf "\033[%sm%s\033[0m" "$1" "$2"; }
bold()  { color "1" "$1"; }
green() { color "32" "$1"; }
red()   { color "31" "$1"; }
gray()  { color "90" "$1"; }
cyan()  { color "36" "$1"; }

print_banner() {
  echo ""
  echo "$(cyan '╔══════════════════════════════════════════╗')"
  echo "$(cyan '║') $(bold '邱懿武 Skill Hub') · 中文方法论 AI 化中枢 $(cyan '║')"
  echo "$(cyan '╚══════════════════════════════════════════╝')"
  echo ""
}

usage() {
  print_banner
  echo "用法："
  echo "  curl -fsSL ${HUB}/install.sh | sh -s $(bold '<skill-slug>')              $(gray '# 装 skill')"
  echo "  curl -fsSL ${HUB}/install.sh | sh -s -- $(bold '--no-skills')            $(gray '# 只装 CLI')"
  echo "  curl -fsSL ${HUB}/install.sh | sh -s -- $(bold '--with-cli') <slug>      $(gray '# 装 CLI + skill')"
  echo ""
  echo "示例："
  echo "  curl -fsSL ${HUB}/install.sh | sh -s innolab"
  echo "  curl -fsSL ${HUB}/install.sh | sh -s zheng-gang-innovation-toolkit"
  echo ""
  echo "列出全部 skill："
  echo "  curl -fsSL ${HUB}/api/v1/skills.json | jq -r '.skills[].id'"
  echo ""
  echo "目录设定（可选）："
  echo "  CLAUDE_SKILLS_DIR=/custom/path  $(gray '默认为 $HOME/.claude/skills')"
  echo "  SKILL_HUB_CLI_DIR=/usr/local/bin $(gray '默认为 $HOME/.local/bin')"
  echo ""
  echo "Spec for AI agents: ${HUB}/install/skill-hub.md"
  echo ""
  exit 0
}

# ── arg parse ──
INSTALL_CLI=0
INSTALL_SKILLS=1
SLUG=""

while [ $# -gt 0 ]; do
  case "$1" in
    -h|--help) usage ;;
    --no-skills) INSTALL_CLI=1; INSTALL_SKILLS=0 ;;
    --no-cli)    INSTALL_CLI=0; INSTALL_SKILLS=1 ;;
    --with-cli)  INSTALL_CLI=1; INSTALL_SKILLS=1 ;;
    -*) echo "$(red "✗ 未知参数: $1")"; exit 1 ;;
    *) [ -z "$SLUG" ] && SLUG="$1" || { echo "$(red '✗ 一次只能装一个 skill')"; exit 1; } ;;
  esac
  shift
done

# Default behavior: if no flag and no slug → show usage
if [ "$INSTALL_SKILLS" = "1" ] && [ -z "$SLUG" ]; then
  usage
fi

# ── deps ──
command -v curl >/dev/null 2>&1 || { echo "$(red '✗ curl 未安装'). 请先装 curl"; exit 1; }

# ── install CLI shim ──
install_cli() {
  echo "→ 安装 $(bold "$CLI_NAME") CLI 到 $(gray "$CLI_DIR")"
  mkdir -p "$CLI_DIR"
  if ! curl -fsSL "${HUB}/install/${CLI_NAME}" -o "$CLI_DIR/$CLI_NAME"; then
    echo "$(red '✗ CLI 下载失败')"
    exit 1
  fi
  chmod +x "$CLI_DIR/$CLI_NAME"
  echo "  $(green '✓') 已写入 $CLI_DIR/$CLI_NAME"

  # PATH 检查
  case ":$PATH:" in
    *":$CLI_DIR:"*) echo "  $(green '✓') $CLI_DIR 已在 PATH 中" ;;
    *)
      echo ""
      echo "$(cyan '提示：') $CLI_DIR 不在 PATH，把这一行加进你的 shell rc："
      echo "  $(bold "export PATH=\"$CLI_DIR:\$PATH\"")"
      ;;
  esac
  echo ""
  echo "  $(gray '用法：') $CLI_NAME --help"
}

# ── install one skill ──
install_skill() {
  s="$1"
  command -v tar >/dev/null 2>&1 || { echo "$(red '✗ tar 未安装'). 请先装 tar"; exit 1; }

  echo "→ 准备安装 $(bold "$s")"
  echo "  目标：$(gray "$DEST/$s")"

  PKG_URL_TAR="${HUB}/${s}.skill.tar.gz"
  PKG_URL_ZIP="${HUB}/${s}.skill.zip"
  URL=""; FORMAT=""
  if curl -sfI "$PKG_URL_TAR" >/dev/null 2>&1; then
    URL="$PKG_URL_TAR"; FORMAT="tar.gz"
  elif curl -sfI "$PKG_URL_ZIP" >/dev/null 2>&1; then
    URL="$PKG_URL_ZIP"; FORMAT="zip"
  else
    echo "$(red '✗ skill not found:') $s"
    echo "查询全部 skill： curl -fsSL ${HUB}/api/v1/skills.json | jq -r '.skills[].id'"
    exit 1
  fi

  TMP=$(mktemp -d); trap "rm -rf $TMP" EXIT
  echo "→ 下载: $(gray "$URL")"
  curl -fsSL "$URL" -o "$TMP/pkg" || { echo "$(red '✗ 下载失败')"; exit 1; }
  SIZE=$(wc -c < "$TMP/pkg" | tr -d ' ')
  echo "  $(gray "${SIZE} bytes")"

  echo "→ 解压到 $(gray "$DEST")"
  mkdir -p "$DEST"
  if [ "$FORMAT" = "tar.gz" ]; then
    tar xzf "$TMP/pkg" -C "$DEST"
  else
    command -v unzip >/dev/null 2>&1 || { echo "$(red '✗ unzip 未安装')"; exit 1; }
    unzip -q "$TMP/pkg" -d "$DEST"
  fi

  if [ -f "$DEST/$s/SKILL.md" ]; then
    echo "  $(green '✓') SKILL.md 已就位"
  fi
  echo ""
  echo "$(green '✓') 安装成功 — $(bold "$s")"
}

# ── execute ──
print_banner

if [ "$INSTALL_CLI" = "1" ]; then
  install_cli
fi

if [ "$INSTALL_SKILLS" = "1" ] && [ -n "$SLUG" ]; then
  install_skill "$SLUG"
fi

# ── final hint ──
echo ""
echo "$(bold '下一步：')"
if [ "$INSTALL_CLI" = "1" ] && [ "$INSTALL_SKILLS" = "0" ]; then
  echo "  $(gray '# CLI 已就位，找一个 skill 装上：')"
  echo "  $CLI_NAME search 分析"
  echo "  $CLI_NAME install innolab"
else
  echo "  $(gray '1. 重启 Claude Code（或重新加载 skill 索引）')"
  echo "  $(gray '2. 说出触发词激活')"
  if [ -n "$SLUG" ]; then
    echo ""
    echo "  $(gray '看 skill 描述：')"
    echo "  cat $DEST/$SLUG/SKILL.md | head -20"
  fi
fi
echo ""
echo "$(gray "Spec: ${HUB}/install/skill-hub.md")"
echo "$(gray "More: ${HUB}")"
