#!/bin/sh
# CodePilot CLI installer
# Preferred install: curl -fsSL https://songlegend.com/codepilot/install | sh

set -e

INSTALL_DIR="$HOME/.codepilot"
BIN_DIR="$HOME/.local/bin"
RELAY_URL="${CODEPILOT_RELAY:-ws://129.204.224.145:4000}"
PIP_PACKAGE="${CODEPILOT_PIP_PACKAGE:-codepilot}"

echo ""
echo "  🚀 Installing CodePilot CLI..."
echo ""

# Find Python 3.10+ — try versioned binaries first, then fall back to python3
PYTHON3=""
for candidate in python3.13 python3.12 python3.11 python3.10 python3; do
  if command -v "$candidate" >/dev/null 2>&1; then
    _maj=$("$candidate" -c "import sys; print(sys.version_info.major)" 2>/dev/null)
    _min=$("$candidate" -c "import sys; print(sys.version_info.minor)" 2>/dev/null)
    if [ "$_maj" -ge 3 ] && [ "$_min" -ge 10 ]; then
      PYTHON3="$candidate"
      break
    fi
  fi
done

if [ -z "$PYTHON3" ]; then
  echo "  ❌ Python 3.10+ not found. Install from https://python.org"
  exit 1
fi

PY_VERSION=$("$PYTHON3" -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
echo "  ✅ Python $PY_VERSION ($PYTHON3)"

# Create install dir and virtualenv
mkdir -p "$INSTALL_DIR"
"$PYTHON3" -m venv "$INSTALL_DIR/venv"

echo "  📦 Installing packages..."
"$INSTALL_DIR/venv/bin/pip" install --quiet --upgrade \
  "typer[all]>=0.12.0" \
  "rich>=13.0.0" \
  "websockets>=12.0" \
  "httpx>=0.27.0" \
  "qrcode>=7.4" \
  "pydantic>=2.0.0"

# Install CodePilot package: dev mode from repo or package index
SCRIPT_DIR="$(cd "$(dirname "$0")" 2>/dev/null && pwd || echo "")"
if [ -f "$SCRIPT_DIR/apps/cli/pyproject.toml" ]; then
  "$INSTALL_DIR/venv/bin/pip" install --quiet -e "$SCRIPT_DIR/apps/cli"
  REPO_DIR="$SCRIPT_DIR"
else
  if ! "$INSTALL_DIR/venv/bin/pip" install --quiet "$PIP_PACKAGE"; then
    if [ "$PIP_PACKAGE" = "codepilot" ]; then
      echo "  ⚠️  'codepilot' package not available yet, falling back to 'codepilot-cli'"
      "$INSTALL_DIR/venv/bin/pip" install --quiet codepilot-cli
    else
      echo "  ❌ Failed to install package: $PIP_PACKAGE"
      exit 1
    fi
  fi
  REPO_DIR=""
fi

echo "  ✅ Packages installed"

# Helper: convert ws:// → http://, wss:// → https://
RELAY_HTTP=$(python3 - "$RELAY_URL" <<'PY'
from urllib.parse import urlparse
import sys
raw = sys.argv[1]
parsed = urlparse(raw)
scheme = "https" if parsed.scheme == "wss" else "http"
netloc = parsed.netloc or parsed.path
path = parsed.path if parsed.netloc else ""
path = "" if path in ("", "/") else path
print(f"{scheme}://{netloc}{path}")
PY
)

# Write the full bash launcher with routing
mkdir -p "$BIN_DIR"
VENV_PYTHON="$INSTALL_DIR/venv/bin/python"

cat > "$BIN_DIR/codepilot" <<LAUNCHER
#!/bin/bash
# CodePilot CLI launcher — generated by install.sh

VENV_PYTHON="${VENV_PYTHON}"
RELAY_URL="${RELAY_URL}"
RELAY_HTTP="${RELAY_HTTP}"

run_cli() {
    "\$VENV_PYTHON" -m codepilot.main "\$@"
}

print_status() {
    echo ""
    HEALTH=\$(curl -fsS "\$RELAY_HTTP/health" 2>/dev/null || true)
    if [ -n "\$HEALTH" ]; then
        SESSIONS=\$(echo "\$HEALTH" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('sessions',0))" 2>/dev/null || echo "?")
        CLIENTS=\$(echo "\$HEALTH" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('clients',0))" 2>/dev/null || echo "?")
        echo "  🟢 Relay online (\$RELAY_HTTP) — \$SESSIONS session(s), \$CLIENTS client(s)"
    else
        echo "  🔴 Relay offline (\$RELAY_HTTP)"
    fi
    run_cli auth status 2>/dev/null || true
    echo ""
}

case "\${1:-help}" in
    claude|codex|opencode)
        agent="\$1"; shift
        run_cli launch "\$agent" "\$@"
        ;;
    agent)
        shift
        run_cli launch claude "\$@"
        ;;
    wrap|auth|openclaw|connect|start|launch)
        cmd="\$1"; shift
        run_cli "\$cmd" "\$@"
        ;;
    status)
        print_status
        ;;
    relay)
        if command -v node >/dev/null 2>&1 && [ -f "\$HOME/codepilot/apps/relay/server.js" ]; then
            node "\$HOME/codepilot/apps/relay/server.js"
        else
            echo "relay server not found locally — deploy via your hosting provider."
        fi
        ;;
    *)
        echo ""
        echo "  CodePilot — 氛围编程 🎶"
        echo ""
        echo "  Usage: codepilot <command>"
        echo ""
        echo "  Quick start:"
        echo "    codepilot claude          Launch Claude Code + show QR"
        echo "    codepilot codex           Launch Codex + show QR"
        echo "    codepilot opencode        Launch OpenCode + show QR"
        echo ""
        echo "  Setup:"
        echo "    codepilot auth login      Log in to your account"
        echo "    codepilot connect claude  Save your Anthropic API key"
        echo "    codepilot connect codex   Save your OpenAI API key"
        echo "    codepilot connect --status  View connected providers"
        echo ""
        echo "  Other:"
        echo "    codepilot status          Relay + auth status"
        echo "    codepilot auth logout     Log out"
        echo ""
        ;;
esac
LAUNCHER

chmod +x "$BIN_DIR/codepilot"
echo "  ✅ Launcher installed → $BIN_DIR/codepilot"

# Add BIN_DIR to PATH if needed
SHELL_RC=""
case "$SHELL" in
  */zsh)  SHELL_RC="$HOME/.zshrc" ;;
  */bash) SHELL_RC="$HOME/.bashrc" ;;
esac

if [ -n "$SHELL_RC" ] && ! grep -q "$BIN_DIR" "$SHELL_RC" 2>/dev/null; then
  printf '\n# CodePilot CLI\nexport PATH="$PATH:%s"\n' "$BIN_DIR" >> "$SHELL_RC"
  echo "  ✅ Added $BIN_DIR to PATH in $SHELL_RC"
fi

echo ""
echo "  ✅ Installation complete!"
echo ""
echo "  Step 1 — log in:"
echo "    codepilot auth login"
echo ""
echo "  Step 2 — launch your agent:"
echo "    codepilot claude"
echo ""
echo "  (If 'codepilot' not found: export PATH=\"\$PATH:$BIN_DIR\")"
echo ""
