#!/bin/sh
# VibeCC install script — idempotent setup for Claude Code.
#
# Usage:
#   curl -fsSL https://vibecc.viettk.com/install.sh | sh
#
# Behavior:
#   - Prompts for VibeCC API key (or reads VIBECC_API_KEY env var).
#   - Optional VIBECC_BASE_URL override (defaults to https://vibecc.viettk.com).
#   - Backs up existing ~/.claude/settings.json to a timestamped sibling.
#   - Merges ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN into the env block,
#     leaving every other key intact. Uses node (already a Claude Code
#     prerequisite) for safe JSON manipulation.
#
# Exit codes:
#   0  success
#   1  user aborted (no key supplied) or node missing
#   2  filesystem error (cannot write settings.json)

set -e

VIBECC_BASE_URL="${VIBECC_BASE_URL:-https://vibecc.viettk.com}"
SETTINGS_DIR="${CLAUDE_CONFIG_DIR:-$HOME/.claude}"
SETTINGS_FILE="$SETTINGS_DIR/settings.json"
TIMESTAMP="$(date +%Y%m%d-%H%M%S)"

if ! command -v node >/dev/null 2>&1; then
  printf "vibecc: node is required (Claude Code prerequisite). Install Node.js first.\n" >&2
  exit 1
fi

# --- 1. Resolve API key ---------------------------------------------------
API_KEY="${VIBECC_API_KEY:-}"
if [ -z "$API_KEY" ]; then
  if [ ! -t 0 ]; then
    printf "vibecc: VIBECC_API_KEY env var is required when running non-interactively\n" >&2
    exit 1
  fi
  printf "Paste your VibeCC API key: "
  IFS= read -r API_KEY
fi
if [ -z "$API_KEY" ]; then
  printf "vibecc: aborted — no API key supplied\n" >&2
  exit 1
fi

# --- 2. Ensure settings dir exists ----------------------------------------
mkdir -p "$SETTINGS_DIR" || {
  printf "vibecc: cannot create %s\n" "$SETTINGS_DIR" >&2
  exit 2
}

# --- 3. Backup existing settings ------------------------------------------
if [ -f "$SETTINGS_FILE" ]; then
  cp "$SETTINGS_FILE" "$SETTINGS_FILE.backup-$TIMESTAMP" || {
    printf "vibecc: cannot back up %s\n" "$SETTINGS_FILE" >&2
    exit 2
  }
  printf "vibecc: backed up existing settings to %s\n" \
    "$SETTINGS_FILE.backup-$TIMESTAMP"
fi

# --- 4. Merge env block via node ------------------------------------------
TMP_FILE="$(mktemp -t vibecc-settings.XXXXXX)" || {
  printf "vibecc: cannot create temp file\n" >&2
  exit 2
}
trap 'rm -f "$TMP_FILE"' EXIT

# Pass values via env so we never interpolate user input into JS source.
SETTINGS_FILE="$SETTINGS_FILE" \
VIBECC_BASE_URL="$VIBECC_BASE_URL" \
VIBECC_API_KEY="$API_KEY" \
TMP_FILE="$TMP_FILE" \
node -e '
const fs = require("fs");
const file = process.env.SETTINGS_FILE;
let cfg = {};
if (fs.existsSync(file)) {
  try {
    const raw = fs.readFileSync(file, "utf8").trim();
    if (raw.length > 0) cfg = JSON.parse(raw);
  } catch (err) {
    process.stderr.write("vibecc: existing settings.json is not valid JSON — replacing.\n");
    cfg = {};
  }
}
if (typeof cfg !== "object" || cfg === null || Array.isArray(cfg)) cfg = {};
const env = (typeof cfg.env === "object" && cfg.env !== null && !Array.isArray(cfg.env)) ? cfg.env : {};
env.ANTHROPIC_BASE_URL = process.env.VIBECC_BASE_URL;
env.ANTHROPIC_AUTH_TOKEN = process.env.VIBECC_API_KEY;
cfg.env = env;
fs.writeFileSync(process.env.TMP_FILE, JSON.stringify(cfg, null, 2) + "\n");
' || {
  printf "vibecc: failed to merge settings.json\n" >&2
  exit 2
}

mv "$TMP_FILE" "$SETTINGS_FILE" || {
  printf "vibecc: cannot write %s\n" "$SETTINGS_FILE" >&2
  exit 2
}
trap - EXIT

KEY_PREFIX="$(printf '%s' "$API_KEY" | cut -c1-8)"
printf "vibecc: configured Claude Code at %s (key=%s...)\n" \
  "$SETTINGS_FILE" "$KEY_PREFIX"
exit 0
