#!/usr/bin/env sh
# install-fastrouter.sh — Configure FastRouter as the model provider in
# DeepSeek Reasonix CLI.
#
# Usage:
#   sh install-fastrouter.sh <FASTROUTER_API_KEY> [<model>]
#   curl -fsSL https://fastrouter.ai/reasonix/install-fastrouter.sh \
#        | sh -s -- <FASTROUTER_API_KEY> [<model>]
#
# What it does (idempotent — safe to re-run):
#   1. Validates the FastRouter API key (rejects redacted / malformed keys).
#   2. Installs Reasonix via `npm install -g reasonix` if missing.
#   3. Merges ~/.reasonix/config.json so apiKey, baseUrl, and model are set
#      to FastRouter values (preserves any other keys the user has).
#   4. chmod 600 on the config file (the API key is stored on disk).
#   5. Prints a masked-key confirmation. Never echoes the raw key.
#
# Hardcoded values (do not change without coordinating with FastRouter):
#   baseUrl        https://api.fastrouter.ai/api/v1
#   default model  deepseek/deepseek-v3.2  (override via second positional arg)

set -eu

FR_BASE_URL="https://api.fastrouter.ai/api/v1"
FR_DASHBOARD="https://dashboard.fastrouter.ai/"
FR_MODELS_PAGE="https://fastrouter.ai/models"
DEFAULT_MODEL="deepseek/deepseek-v3.2"

# ---------- 1. Validate input ----------

API_KEY="${1:-}"
if [ "${2:-}" != "" ]; then
  MODEL="${2}"
  MODEL_EXPLICIT=1
else
  MODEL="${DEFAULT_MODEL}"
  MODEL_EXPLICIT=0
fi

if [ -z "${API_KEY}" ]; then
  printf 'Error: FastRouter API key is required.\n' >&2
  printf 'Usage:\n' >&2
  printf '  sh install-fastrouter.sh <FASTROUTER_API_KEY> [<model>]\n' >&2
  printf 'Generate a key at %s\n' "${FR_DASHBOARD}" >&2
  exit 64
fi

# Reject redactions / placeholder garbage before they corrupt config.
case "${API_KEY}" in
  *REDACTED*|*redacted*|"<redacted>"|"***"|"")
    printf 'Error: API key looks redacted (got "%s").\n' "${API_KEY}" >&2
    printf 'Re-run from a terminal where the key is visible to the script.\n' >&2
    exit 65
    ;;
esac

case "${API_KEY}" in
  sk-v1-*) : ;;
  *)
    printf 'Error: API key must start with "sk-v1-".\n' >&2
    printf 'Generate one at %s\n' "${FR_DASHBOARD}" >&2
    exit 65
    ;;
esac

KEY_REST=${API_KEY#sk-v1-}
if [ -z "${KEY_REST}" ]; then
  printf 'Error: API key has nothing after "sk-v1-" prefix.\n' >&2
  exit 65
fi

# Compute masked form for confirmations (POSIX: avoid bash ${var: -4})
KEY_LEN=$(printf '%s' "${API_KEY}" | wc -c | tr -d ' ')
LAST4=$(printf '%s' "${API_KEY}" | awk '{print substr($0, length-3)}')
MASKED="****${LAST4}"

printf 'FastRouter installer for DeepSeek Reasonix CLI\n'
printf '  Key:   %s  (len=%s)\n' "${MASKED}" "${KEY_LEN}"
printf '  Model: %s\n' "${MODEL}"
printf '\n'

# ---------- 2. Ensure Reasonix CLI is installed ----------

if ! command -v reasonix >/dev/null 2>&1; then
  printf 'Reasonix CLI not found — installing via npm...\n'
  if ! command -v npm >/dev/null 2>&1; then
    printf 'Error: npm is required but not installed.\n' >&2
    printf 'Install Node.js (>=20) first: https://nodejs.org/\n' >&2
    exit 127
  fi
  npm install -g reasonix
fi

REASONIX_VERSION=$(reasonix --version 2>/dev/null || echo "unknown")
printf 'Reasonix CLI: %s\n' "${REASONIX_VERSION}"

# ---------- 3. Merge ~/.reasonix/config.json ----------

REASONIX_DIR="${HOME}/.reasonix"
CONFIG_FILE="${REASONIX_DIR}/config.json"

mkdir -p "${REASONIX_DIR}"
if [ ! -f "${CONFIG_FILE}" ]; then
  echo '{}' > "${CONFIG_FILE}"
fi

# Backup once per day at most.
BACKUP="${CONFIG_FILE}.bak.$(date +%Y%m%d)"
if [ ! -f "${BACKUP}" ]; then
  cp "${CONFIG_FILE}" "${BACKUP}"
fi

if ! command -v python3 >/dev/null 2>&1; then
  printf 'Error: python3 is required for safe JSON merging.\n' >&2
  exit 127
fi

# Robust JSON merge: preserve all existing keys, set apiKey/baseUrl always,
# and set model only if explicit OR not already present.
# API key passed via env (NOT argv) so it never appears in `ps` output.
API_KEY="${API_KEY}" \
MODEL_ARG="${MODEL}" \
MODEL_EXPLICIT="${MODEL_EXPLICIT}" \
BASE_URL="${FR_BASE_URL}" \
python3 - "${CONFIG_FILE}" <<'PY'
import json, os, sys, pathlib

path     = pathlib.Path(sys.argv[1])
key      = os.environ["API_KEY"]
model    = os.environ["MODEL_ARG"]
explicit = os.environ.get("MODEL_EXPLICIT", "0") == "1"
base_url = os.environ["BASE_URL"]

# Read existing config (tolerate empty / malformed file).
try:
    cfg = json.loads(path.read_text() or "{}")
    if not isinstance(cfg, dict):
        cfg = {}
except (json.JSONDecodeError, FileNotFoundError):
    cfg = {}

# apiKey: always overwrite — this is the whole point of the installer.
cfg["apiKey"]  = key

# baseUrl: always force to FastRouter — the whole point of the installer.
cfg["baseUrl"] = base_url

# model: override only when explicitly passed; otherwise insert default
# only if the key is missing entirely (preserves user's chosen slug on re-run).
if explicit or "model" not in cfg:
    cfg["model"] = model

path.write_text(json.dumps(cfg, indent=2) + "\n")
PY

# ---------- 4. Restrict file permissions ----------

# The API key is stored on disk in cleartext. Owner-only.
chmod 600 "${CONFIG_FILE}"

printf 'Config:       %s (mode 600)\n' "${CONFIG_FILE}"

# ---------- 5. Report success ----------

printf '\n'
printf '✓ FastRouter is configured for DeepSeek Reasonix CLI (%s).\n' "${MASKED}"
printf '\n'
printf 'Start Reasonix from any project:\n'
printf '  cd /path/to/your/project\n'
printf '  reasonix code\n'
printf '\n'
printf 'Switch models by editing "model" in %s.\n' "${CONFIG_FILE}"
printf 'Browse slugs at %s.\n' "${FR_MODELS_PAGE}"

