#!/bin/sh
set -eu

BASE_URL="${ANTHROPIC_BASE_URL:-https://api.virouter.com}"
SETTINGS_PATH="${CLAUDE_SETTINGS_PATH:-${HOME:-}/.claude/settings.json}"
ENABLE_MODEL_DISCOVERY="${CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY:-1}"
DRY_RUN=0
API_KEY="${VIROUTER_API_KEY:-${ANTHROPIC_AUTH_TOKEN:-}}"

usage() {
  cat <<'USAGE'
Virouter Claude Code installer

Usage:
  sh install-claude-code.sh <virouter_api_key>
  curl -fsSL https://virouter.com/install/claude-code.sh | sh -s -- <virouter_api_key>

Options:
  --key <key>          Virouter API key. You can also set VIROUTER_API_KEY.
  --base-url <url>     Anthropic-compatible base URL. Default: https://api.virouter.com
  --settings <path>    Claude Code settings path. Default: ~/.claude/settings.json
  --dry-run            Validate and show the target path without writing.
  -h, --help           Show this help.
USAGE
}

while [ "$#" -gt 0 ]; do
  case "$1" in
    --key)
      [ "$#" -ge 2 ] || { echo "Missing value for --key" >&2; exit 2; }
      API_KEY="$2"
      shift 2
      ;;
    --base-url)
      [ "$#" -ge 2 ] || { echo "Missing value for --base-url" >&2; exit 2; }
      BASE_URL="$2"
      shift 2
      ;;
    --settings)
      [ "$#" -ge 2 ] || { echo "Missing value for --settings" >&2; exit 2; }
      SETTINGS_PATH="$2"
      shift 2
      ;;
    --dry-run)
      DRY_RUN=1
      shift
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    -*)
      echo "Unknown option: $1" >&2
      usage >&2
      exit 2
      ;;
    *)
      if [ -n "$API_KEY" ]; then
        echo "Unexpected argument: $1" >&2
        usage >&2
        exit 2
      fi
      API_KEY="$1"
      shift
      ;;
  esac
done

if [ -z "${HOME:-}" ] && [ "${SETTINGS_PATH#/}" = "$SETTINGS_PATH" ]; then
  echo "HOME is not set; pass --settings with an absolute path." >&2
  exit 1
fi

if [ -z "$API_KEY" ]; then
  if [ -t 0 ]; then
    printf "Enter your Virouter API key: " >&2
    stty -echo 2>/dev/null || true
    IFS= read -r API_KEY
    stty echo 2>/dev/null || true
    printf "\n" >&2
  else
    echo "Missing Virouter API key. Pass it as an argument or set VIROUTER_API_KEY." >&2
    exit 2
  fi
fi

case "$API_KEY" in
  vr_sk_*) ;;
  *)
    echo "The key does not look like a Virouter API key. Expected prefix: vr_sk_" >&2
    exit 2
    ;;
esac

mask_key() {
  key="$1"
  len=${#key}
  if [ "$len" -le 12 ]; then
    printf '%s' 'vr_sk_***'
  else
    first=$(printf '%s' "$key" | cut -c 1-8)
    last_start=$((len - 3))
    last=$(printf '%s' "$key" | cut -c "$last_start-$len")
    printf '%s***%s' "$first" "$last"
  fi
}

SETTINGS_DIR=$(dirname "$SETTINGS_PATH")
MASKED_KEY=$(mask_key "$API_KEY")

printf 'Virouter Claude Code installer\n'
printf 'Settings: %s\n' "$SETTINGS_PATH"
printf 'Gateway:  %s\n' "$BASE_URL"
printf 'Key:      %s\n' "$MASKED_KEY"

if [ "$DRY_RUN" -eq 1 ]; then
  printf 'Dry run only; no files were changed.\n'
  exit 0
fi

mkdir -p "$SETTINGS_DIR"
TMP_FILE="$(mktemp "${SETTINGS_DIR}/settings.json.tmp.XXXXXX")"
cleanup() {
  rm -f "$TMP_FILE"
}
trap cleanup EXIT INT TERM

if command -v node >/dev/null 2>&1; then
  SETTINGS_PATH="$SETTINGS_PATH" TMP_FILE="$TMP_FILE" API_KEY="$API_KEY" BASE_URL="$BASE_URL" ENABLE_MODEL_DISCOVERY="$ENABLE_MODEL_DISCOVERY" node -e '
const fs = require("fs");
const source = process.env.SETTINGS_PATH;
const target = process.env.TMP_FILE;
let settings = {};
if (fs.existsSync(source)) {
  const text = fs.readFileSync(source, "utf8").trim();
  if (text) settings = JSON.parse(text);
}
if (!settings || Array.isArray(settings) || typeof settings !== "object") settings = {};
settings.env = settings.env && typeof settings.env === "object" && !Array.isArray(settings.env) ? settings.env : {};
settings.env.ANTHROPIC_BASE_URL = process.env.BASE_URL;
settings.env.ANTHROPIC_AUTH_TOKEN = process.env.API_KEY;
settings.env.CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY = process.env.ENABLE_MODEL_DISCOVERY || "1";
fs.writeFileSync(target, JSON.stringify(settings, null, 2) + "\n", { mode: 0o600 });
'
elif command -v python3 >/dev/null 2>&1; then
  SETTINGS_PATH="$SETTINGS_PATH" TMP_FILE="$TMP_FILE" API_KEY="$API_KEY" BASE_URL="$BASE_URL" ENABLE_MODEL_DISCOVERY="$ENABLE_MODEL_DISCOVERY" python3 -c '
import json, os
source = os.environ["SETTINGS_PATH"]
target = os.environ["TMP_FILE"]
settings = {}
if os.path.exists(source):
    text = open(source, encoding="utf-8").read().strip()
    if text:
        settings = json.loads(text)
if not isinstance(settings, dict):
    settings = {}
env = settings.get("env")
if not isinstance(env, dict):
    env = {}
settings["env"] = env
env["ANTHROPIC_BASE_URL"] = os.environ["BASE_URL"]
env["ANTHROPIC_AUTH_TOKEN"] = os.environ["API_KEY"]
env["CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY"] = os.environ.get("ENABLE_MODEL_DISCOVERY", "1")
with open(target, "w", encoding="utf-8") as fh:
    json.dump(settings, fh, indent=2)
    fh.write("\n")
os.chmod(target, 0o600)
'
else
  if [ -e "$SETTINGS_PATH" ]; then
    echo "Existing settings file found, but neither node nor python3 is available to merge JSON safely." >&2
    echo "Install node/python3 or update $SETTINGS_PATH manually." >&2
    exit 1
  fi
  umask 077
  {
    printf '{\n'
    printf '  "env": {\n'
    printf '    "ANTHROPIC_BASE_URL": "%s",\n' "$BASE_URL"
    printf '    "ANTHROPIC_AUTH_TOKEN": "%s",\n' "$API_KEY"
    printf '    "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "%s"\n' "$ENABLE_MODEL_DISCOVERY"
    printf '  }\n'
    printf '}\n'
  } > "$TMP_FILE"
fi

if [ -e "$SETTINGS_PATH" ]; then
  BACKUP_PATH="${SETTINGS_PATH}.bak.$(date +%Y%m%d%H%M%S)"
  cp "$SETTINGS_PATH" "$BACKUP_PATH"
  chmod 600 "$BACKUP_PATH" 2>/dev/null || true
  printf 'Backup:   %s\n' "$BACKUP_PATH"
fi

mv "$TMP_FILE" "$SETTINGS_PATH"
chmod 600 "$SETTINGS_PATH" 2>/dev/null || true
trap - EXIT INT TERM

printf '\nClaude Code is configured for Virouter. Start Claude Code from a new terminal with:\n'
printf '  claude\n'
printf '\nTo verify the gateway manually:\n'
printf '  curl %s/v1/models -H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN"\n' "$BASE_URL"
