#!/usr/bin/env bash
set -euo pipefail

CONFIG_PATH="/home/kuhnn/.openclaw/openclaw.json"
PROFILES_DIR="/home/kuhnn/.openclaw/profiles"
SERVICE_NAME="openclaw-gateway.service"

usage() {
  cat <<'EOF'
openclaw-switch-model.sh — 一键切换 OpenClaw 大模型/账号配置（通过切换整份配置文件）

用法：
  openclaw-switch-model.sh list
  openclaw-switch-model.sh current
  openclaw-switch-model.sh save <name>
  openclaw-switch-model.sh switch <name>

说明：
- 本脚本通过把 ~/.openclaw/openclaw.json 替换为 profiles/<name>.json 来实现“切换模型/账号/API”。
- 切换后会自动重启用户级 systemd 服务：openclaw-gateway.service。
- 你可以把不同账号/不同 provider 的配置分别保存成不同 profile 文件。

例子：
  openclaw-switch-model.sh save work
  # 编辑 ~/.openclaw/profiles/work.json，改模型/改 API key/改 auth profile
  openclaw-switch-model.sh switch work

注意：
- profiles/*.json 里可能包含敏感 token/apiKey，请注意权限与备份安全。
EOF
}

ensure() {
  mkdir -p "$PROFILES_DIR"
  if [[ ! -f "$CONFIG_PATH" ]]; then
    echo "[ERR] 找不到配置文件：$CONFIG_PATH" >&2
    exit 1
  fi
}

list_profiles() {
  ensure
  echo "Profiles in $PROFILES_DIR:" 
  (cd "$PROFILES_DIR" && ls -1 *.json 2>/dev/null | sed 's/\.json$//' || true)
}

show_current() {
  ensure
  echo "Config: $CONFIG_PATH"
  if command -v python3 >/dev/null 2>&1; then
    python3 - <<'PY'
import json
p='/home/kuhnn/.openclaw/openclaw.json'
try:
  c=json.load(open(p))
  primary=c.get('agents',{}).get('defaults',{}).get('model',{}).get('primary')
  print('agents.defaults.model.primary =', primary)
  profiles=list((c.get('auth',{}).get('profiles',{}) or {}).keys())
  print('auth.profiles =', profiles)
except Exception as e:
  print('Failed to parse config:', e)
PY
  else
    echo "(python3 不可用，略过解析)"
  fi
}

backup() {
  local ts
  ts=$(date +%Y%m%d-%H%M%S)
  cp -a "$CONFIG_PATH" "$CONFIG_PATH.bak.$ts"
  echo "[OK] 已备份当前配置 -> $CONFIG_PATH.bak.$ts"
}

save_profile() {
  ensure
  local name=${1:?name required}
  local dst="$PROFILES_DIR/$name.json"
  if [[ -e "$dst" ]]; then
    echo "[ERR] profile 已存在：$dst" >&2
    exit 1
  fi
  cp -a "$CONFIG_PATH" "$dst"
  chmod 600 "$dst" || true
  echo "[OK] 已保存 profile：$dst"
}

switch_profile() {
  ensure
  local name=${1:?name required}
  local src="$PROFILES_DIR/$name.json"
  if [[ ! -f "$src" ]]; then
    echo "[ERR] profile 不存在：$src" >&2
    echo "可用 profiles："; list_profiles
    exit 1
  fi

  backup
  cp -a "$src" "$CONFIG_PATH"
  chmod 600 "$CONFIG_PATH" || true
  echo "[OK] 已切换配置：$name -> $CONFIG_PATH"

  echo "[..] 重启 OpenClaw Gateway（user service）..."
  systemctl --user restart "$SERVICE_NAME"
  sleep 1
  systemctl --user --no-pager --full status "$SERVICE_NAME" | sed -n '1,12p'
  echo "[OK] 完成。"
}

cmd=${1:-}
case "$cmd" in
  -h|--help|help|"") usage ;;
  list) list_profiles ;;
  current) show_current ;;
  save) shift; save_profile "$@" ;;
  switch) shift; switch_profile "$@" ;;
  *) echo "[ERR] unknown command: $cmd" >&2; usage; exit 2 ;;
esac
