#!/usr/bin/env bash
# OpusGate - Claude Code auto-setup for macOS / Linux
# Usage:
#   curl -fsSL https://opusgate.dev/install.sh | bash
#   curl -fsSL https://opusgate.dev/install.sh | OPUSGATE_KEY="sk-og-..." bash
set -euo pipefail

write_fresh_settings() {
  cat > "$1" <<EOF
{
  "env": {
    "ANTHROPIC_BASE_URL": "https://api.opusgate.dev",
    "ANTHROPIC_AUTH_TOKEN": "$KEY",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4.8",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4.6",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-haiku-4.5",
    "DISABLE_TELEMETRY": "1",
    "DISABLE_ERROR_REPORTING": "1"
  }
}
EOF
}

ensure_local_bin_on_path() {
  case ":$PATH:" in
    *":$HOME/.local/bin:"*) ;;
    *)
      RC="$HOME/.bashrc"
      case "${SHELL:-}" in *zsh) RC="$HOME/.zshrc" ;; esac
      if ! grep -qs '.local/bin' "$RC"; then
        printf '\nexport PATH="$HOME/.local/bin:$PATH"\n' >> "$RC"
        echo "Added ~/.local/bin to PATH in $RC (open a new terminal to pick it up)."
      fi
      export PATH="$HOME/.local/bin:$PATH"
      ;;
  esac
}

main() {
  echo ""
  echo "OpusGate - Claude Code setup"
  echo ""

  if [ "$(id -u)" = "0" ]; then
    echo "Note: running as root - Claude Code and the config go to root's home."
  fi

  # --- 1. API key -------------------------------------------------------
  KEY="${OPUSGATE_KEY:-}"
  if [ -z "$KEY" ]; then
    PROMPT="Paste your OpusGate API key (sk-og-..., from https://opusgate.dev/keys): "
    if [ -t 0 ]; then
      read -r -p "$PROMPT" KEY
    elif (exec </dev/tty) 2>/dev/null; then
      read -r -p "$PROMPT" KEY </dev/tty
    else
      echo "No API key. Re-run with the key inline:" >&2
      echo '  curl -fsSL https://opusgate.dev/install.sh | OPUSGATE_KEY="sk-og-..." bash' >&2
      exit 1
    fi
  fi
  KEY="$(printf '%s' "$KEY" | tr -d '[:space:]')"
  case "$KEY" in
    sk-og-*) ;;
    *) echo "That doesn't look like an OpusGate key (expected sk-og-...). Aborting." >&2; exit 1 ;;
  esac

  # --- 2. Claude Code ---------------------------------------------------
  if command -v claude >/dev/null 2>&1; then
    echo "Claude Code already installed - skipping install."
  elif [ -x "$HOME/.local/bin/claude" ]; then
    # Installed but not on PATH yet (e.g. terminal not reopened after install).
    echo "Claude Code found at ~/.local/bin/claude - skipping download, fixing PATH."
    ensure_local_bin_on_path
  else
    # Primary path: download the official binary straight from Anthropic's
    # distribution bucket. Same binary the claude.ai installer fetches, but the
    # bucket is reachable in regions where claude.ai itself is geo-blocked.
    BUCKET="https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases"
    OS="$(uname -s)"; ARCH="$(uname -m)"
    PLATFORM=""
    case "$OS" in
      Darwin) PLATFORM="darwin" ;;
      Linux)  PLATFORM="linux" ;;
    esac
    case "$ARCH" in
      arm64|aarch64) PLATFORM="$PLATFORM-arm64" ;;
      x86_64|amd64)  PLATFORM="$PLATFORM-x64" ;;
      *) PLATFORM="" ;;
    esac
    if [ "$OS" = "Linux" ] && [ -n "$PLATFORM" ] && ldd --version 2>&1 | grep -qi musl; then
      PLATFORM="$PLATFORM-musl"
    fi

    INSTALLED=0
    if [ -n "$PLATFORM" ]; then
      VERSION="$(curl -fsSL --max-time 30 "$BUCKET/stable" | tr -d '[:space:]')" || VERSION=""
      if [ -n "$VERSION" ]; then
        mkdir -p "$HOME/.local/bin"
        echo "Downloading Claude Code $VERSION ($PLATFORM, ~220 MB)..."
        if curl -fL --progress-bar -o "$HOME/.local/bin/claude" "$BUCKET/$VERSION/$PLATFORM/claude"; then
          # Verify checksum against the manifest when a sha256 tool is available.
          SUM=""
          if command -v sha256sum >/dev/null 2>&1; then
            SUM="$(sha256sum "$HOME/.local/bin/claude" | cut -d' ' -f1)"
          elif command -v shasum >/dev/null 2>&1; then
            SUM="$(shasum -a 256 "$HOME/.local/bin/claude" | cut -d' ' -f1)"
          fi
          EXPECTED="$(curl -fsSL --max-time 30 "$BUCKET/$VERSION/manifest.json" | grep -A3 "\"$PLATFORM\"" | grep '"checksum"' | head -1 | cut -d'"' -f4)" || EXPECTED=""
          if [ -n "$SUM" ] && [ -n "$EXPECTED" ] && [ "$SUM" != "$EXPECTED" ]; then
            rm -f "$HOME/.local/bin/claude"
            echo "Checksum mismatch - corrupted download." >&2
          else
            chmod +x "$HOME/.local/bin/claude"
            INSTALLED=1
            echo "Claude Code $VERSION installed to ~/.local/bin/claude"
          fi
        fi
      fi
    fi

    if [ "$INSTALLED" -ne 1 ]; then
      echo "Direct download failed - trying the official installer (unavailable in some regions)..."
      if curl -fsSL https://claude.ai/install.sh | bash; then INSTALLED=1; fi
    fi
    if [ "$INSTALLED" -ne 1 ]; then
      echo "Could not install Claude Code automatically." >&2
      echo "If you have Node.js, run: npm install -g @anthropic-ai/claude-code - then re-run this script." >&2
      exit 1
    fi
    ensure_local_bin_on_path
  fi

  # --- 3. settings.json: merge into existing, or write fresh -------------
  SETTINGS="$HOME/.claude/settings.json"
  mkdir -p "$HOME/.claude"
  if [ -f "$SETTINGS" ]; then
    cp "$SETTINGS" "$SETTINGS.bak"
    echo "Existing settings.json backed up to settings.json.bak"
    MERGED=0
    if command -v python3 >/dev/null 2>&1; then
      python3 - "$SETTINGS" "$KEY" <<'PYEOF' && MERGED=1 || true
import json, sys
path, key = sys.argv[1], sys.argv[2]
with open(path) as f:
    data = json.load(f)
if not isinstance(data, dict):
    raise SystemExit(1)
env = data.get("env")
if not isinstance(env, dict):
    env = {}
    data["env"] = env
env.update({
    "ANTHROPIC_BASE_URL": "https://api.opusgate.dev",
    "ANTHROPIC_AUTH_TOKEN": key,
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4.8",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4.6",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-haiku-4.5",
    "DISABLE_TELEMETRY": "1",
    "DISABLE_ERROR_REPORTING": "1",
})
with open(path, "w") as f:
    json.dump(data, f, indent=2)
    f.write("\n")
PYEOF
    elif command -v node >/dev/null 2>&1; then
      OG_SETTINGS="$SETTINGS" OG_KEY="$KEY" node -e 'const fs=require("fs");const p=process.env.OG_SETTINGS;const d=JSON.parse(fs.readFileSync(p,"utf8"));if(typeof d!=="object"||d===null||Array.isArray(d))process.exit(1);if(typeof d.env!=="object"||d.env===null||Array.isArray(d.env))d.env={};Object.assign(d.env,{ANTHROPIC_BASE_URL:"https://api.opusgate.dev",ANTHROPIC_AUTH_TOKEN:process.env.OG_KEY,ANTHROPIC_DEFAULT_OPUS_MODEL:"claude-opus-4.8",ANTHROPIC_DEFAULT_SONNET_MODEL:"claude-sonnet-4.6",ANTHROPIC_DEFAULT_HAIKU_MODEL:"claude-haiku-4.5",DISABLE_TELEMETRY:"1",DISABLE_ERROR_REPORTING:"1"});fs.writeFileSync(p,JSON.stringify(d,null,2)+"\n");' && MERGED=1 || true
    fi
    if [ "$MERGED" -eq 1 ]; then
      echo "Merged OpusGate settings into your existing settings.json (other settings preserved)."
    else
      echo "Could not merge (no python3/node, or the file isn't valid JSON) - writing a fresh settings.json (old file kept as .bak)."
      write_fresh_settings "$SETTINGS"
    fi
  else
    write_fresh_settings "$SETTINGS"
  fi

  echo ""
  echo "Done. Run: claude"
  echo "Previously logged in with an Anthropic account? Run /logout inside claude once."
  echo "Models: /model inside Claude Code. Balance: https://opusgate.dev/dashboard"
}

main "$@"
