#!/usr/bin/env bash
set -euo pipefail
BASE_URL="https://goon-4mj.pages.dev/files"
TARGET="${GOON_TARGET:-all}"

usage() {
  cat <<'USAGE'
Usage: install.sh [--agent pi|claude|codex|all]

Default: all. Coding agents should pass their own agent name when known.
USAGE
}

while [ "$#" -gt 0 ]; do
  case "$1" in
    --agent|--target)
      TARGET="${2:-}"
      shift 2
      ;;
    --agent=*|--target=*)
      TARGET="${1#*=}"
      shift
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      echo "Unknown option: $1" >&2
      usage >&2
      exit 1
      ;;
  esac
done

case "$TARGET" in
  pi|Pi|PI|pi-coding-agent) TARGET="pi" ;;
  claude|Claude|CLAUDE|claude-code) TARGET="claude" ;;
  codex|Codex|CODEX|openai-codex) TARGET="codex" ;;
  all|auto|unknown|"") TARGET="all" ;;
  *) echo "Unknown agent target: $TARGET" >&2; usage >&2; exit 1 ;;
esac

fetch() {
  local url="$1" out="$2"
  if command -v curl >/dev/null 2>&1; then
    curl -fsSL "$url" -o "$out"
  elif command -v wget >/dev/null 2>&1; then
    wget -qO "$out" "$url"
  else
    echo "Need curl or wget to install /goon" >&2
    exit 1
  fi
}

installed=()

install_pi() {
  PI_AGENT_DIR="${PI_CODING_AGENT_DIR:-$HOME/.pi/agent}"
  PI_EXT_DIR="$PI_AGENT_DIR/extensions"
  PI_ASSET_DIR="$PI_AGENT_DIR/assets"
  mkdir -p "$PI_EXT_DIR" "$PI_ASSET_DIR"
  fetch "$BASE_URL/goon.ts" "$PI_EXT_DIR/goon.ts"
  fetch "$BASE_URL/goon.wav" "$PI_ASSET_DIR/goon.wav"
  chmod 644 "$PI_EXT_DIR/goon.ts" "$PI_ASSET_DIR/goon.wav"
  installed+=("Pi Coding Agent")
}

install_claude() {
  CLAUDE_DIR="${CLAUDE_CODE_HOME:-$HOME/.claude}"
  CLAUDE_CMD_DIR="$CLAUDE_DIR/commands"
  CLAUDE_ASSET_DIR="$CLAUDE_DIR/assets"
  mkdir -p "$CLAUDE_CMD_DIR" "$CLAUDE_ASSET_DIR"
  fetch "$BASE_URL/claude-goon.md" "$CLAUDE_CMD_DIR/goon.md"
  fetch "$BASE_URL/goon-play.sh" "$CLAUDE_ASSET_DIR/goon-play.sh"
  fetch "$BASE_URL/goon.wav" "$CLAUDE_ASSET_DIR/goon.wav"
  chmod 644 "$CLAUDE_CMD_DIR/goon.md" "$CLAUDE_ASSET_DIR/goon.wav"
  chmod 755 "$CLAUDE_ASSET_DIR/goon-play.sh"
  installed+=("Claude Code")
}

install_codex() {
  # Current Codex discovers user skills from ~/.agents/skills. Install the real skill only.
  AGENTS_SKILL_DIR="${AGENTS_HOME:-$HOME/.agents}/skills/goon"
  mkdir -p "$AGENTS_SKILL_DIR/scripts" "$AGENTS_SKILL_DIR/assets"
  fetch "$BASE_URL/codex-goon-SKILL.md" "$AGENTS_SKILL_DIR/SKILL.md"
  fetch "$BASE_URL/goon-play.sh" "$AGENTS_SKILL_DIR/scripts/goon-play.sh"
  fetch "$BASE_URL/goon.wav" "$AGENTS_SKILL_DIR/assets/goon.wav"
  chmod 644 "$AGENTS_SKILL_DIR/SKILL.md" "$AGENTS_SKILL_DIR/assets/goon.wav"
  chmod 755 "$AGENTS_SKILL_DIR/scripts/goon-play.sh"
  installed+=("Codex")
}

case "$TARGET" in
  pi) install_pi ;;
  claude) install_claude ;;
  codex) install_codex ;;
  all) install_pi; install_claude; install_codex ;;
esac

printf '/goon installed for: %s\n\n' "$(IFS=', '; echo "${installed[*]}")"
cat <<'MSG'
Next:
  - Pi: type /reload if Pi is already open, then /goon
  - Claude Code: restart Claude Code if /goon does not appear, then type /goon
  - Codex: restart Codex, then use the installed goon skill with "$goon" or ask "run goon". Codex may not support custom top-level /goon slash commands.

Note: Claude/Codex may ask permission the first time /goon runs the bash audio helper.
MSG
