#!/usr/bin/env bash
# Claude Key Tool (Linux) — cấu hình Claude Code CLI + extension VS Code / Cursor / Codium
# Cách dùng:
#   chmod +x ClaudeKeyTool.sh
#   ./ClaudeKeyTool.sh                 # menu tương tác
#   ./ClaudeKeyTool.sh sk-xxxx         # áp dụng key luôn
#   ./ClaudeKeyTool.sh --reset         # gỡ cấu hình
set -euo pipefail
export LANG="${LANG:-C.UTF-8}"
export LC_ALL="${LC_ALL:-C.UTF-8}"

VERSION="1.2.4"
GATEWAY="https://api.nghimmo.com"
SETTINGS="${HOME}/.claude/settings.json"
CLAUDE_JSON="${HOME}/.claude.json"
LOG="${HOME}/.local/share/claude-key-tool/claude-key-tool.log"

log() {
  mkdir -p "$(dirname "$LOG")"
  printf '%s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" >>"$LOG"
}

say() {
  echo "[Claude Key Tool] $*" >&2
  log "$*"
}

clear_extension_cache() {
  local rel="User/globalStorage/anthropic.claude-code"
  local base
  for base in \
    "${HOME}/.config/Code" \
    "${HOME}/.config/Code - Insiders" \
    "${HOME}/.config/Cursor" \
    "${HOME}/.config/VSCodium" \
    "${HOME}/.config/Antigravity"
  do
    if [ -d "${base}/${rel}" ]; then
      rm -rf "${base}/${rel}"
      log "cleared extension cache: ${base}/${rel}"
    fi
  done
}

write_claude_code() {
  local key="$1"
  mkdir -p "$(dirname "$SETTINGS")"
  clear_extension_cache
  if command -v python3 >/dev/null 2>&1; then
    SETTINGS="$SETTINGS" CLAUDE_JSON="$CLAUDE_JSON" GATEWAY="$GATEWAY" KEY="$key" python3 <<'PY'
import json, os
from pathlib import Path
sf = Path(os.environ["SETTINGS"])
data = {}
if sf.exists():
    try:
        data = json.loads(sf.read_text(encoding="utf-8"))
    except json.JSONDecodeError:
        data = {}
if not isinstance(data, dict):
    data = {}
env = data.get("env")
if not isinstance(env, dict):
    env = {}
env["ANTHROPIC_BASE_URL"] = os.environ["GATEWAY"]
env["ANTHROPIC_AUTH_TOKEN"] = os.environ["KEY"]
env["ANTHROPIC_MODEL"] = "nghi/claude-sonnet-5[1m]"
env["ANTHROPIC_DEFAULT_OPUS_MODEL"] = "nghi/claude-opus-5[1m]"
env["ANTHROPIC_DEFAULT_SONNET_MODEL"] = "nghi/claude-sonnet-5[1m]"
env["ANTHROPIC_SMALL_FAST_MODEL"] = "nghi/claude-haiku-4.5[1m]"
env["ANTHROPIC_DEFAULT_HAIKU_MODEL"] = "nghi/claude-haiku-4.5[1m]"
env["CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY"] = "1"
env["CLAUDE_CODE_DISABLE_REFUSAL_FALLBACK"] = "1"
env["API_TIMEOUT_MS"] = "600000"
env.pop("ANTHROPIC_API_KEY", None)
data["env"] = env
sf.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
cj = Path(os.environ["CLAUDE_JSON"])
if cj.exists():
    try:
        cdata = json.loads(cj.read_text(encoding="utf-8"))
        if isinstance(cdata, dict):
            for k in ("primaryApiKey", "customApiKeyResponses"):
                cdata.pop(k, None)
            cj.write_text(json.dumps(cdata, indent=2) + "\n", encoding="utf-8")
    except json.JSONDecodeError:
        pass
PY
  else
    cat >"$SETTINGS" <<EOF
{
  "env": {
    "ANTHROPIC_BASE_URL": "$GATEWAY",
    "ANTHROPIC_AUTH_TOKEN": "$key",
    "ANTHROPIC_MODEL": "nghi/claude-sonnet-5[1m]",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "nghi/claude-opus-5[1m]",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "nghi/claude-sonnet-5[1m]",
    "ANTHROPIC_SMALL_FAST_MODEL": "nghi/claude-haiku-4.5[1m]",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "nghi/claude-haiku-4.5[1m]",
    "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "1",
    "CLAUDE_CODE_DISABLE_REFUSAL_FALLBACK": "1",
    "API_TIMEOUT_MS": "600000"
  }
}
EOF
  fi
}

reset_all() {
  clear_extension_cache
  if command -v python3 >/dev/null 2>&1 && [ -f "$SETTINGS" ]; then
    SETTINGS="$SETTINGS" CLAUDE_JSON="$CLAUDE_JSON" python3 <<'PY'
import json, os
from pathlib import Path
for path_key in ("SETTINGS", "CLAUDE_JSON"):
    p = Path(os.environ[path_key])
    if not p.exists():
        continue
    try:
        data = json.loads(p.read_text(encoding="utf-8"))
    except json.JSONDecodeError:
        continue
    if path_key == "SETTINGS" and isinstance(data.get("env"), dict):
        for k in (
            "ANTHROPIC_AUTH_TOKEN", "ANTHROPIC_API_KEY", "ANTHROPIC_BASE_URL",
            "ANTHROPIC_MODEL", "ANTHROPIC_DEFAULT_OPUS_MODEL",
            "ANTHROPIC_DEFAULT_SONNET_MODEL", "ANTHROPIC_SMALL_FAST_MODEL",
            "ANTHROPIC_DEFAULT_HAIKU_MODEL",
            "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY",
            "CLAUDE_CODE_DISABLE_REFUSAL_FALLBACK", "API_TIMEOUT_MS",
        ):
            data["env"].pop(k, None)
    if path_key == "CLAUDE_JSON" and isinstance(data, dict):
        for k in ("primaryApiKey", "customApiKeyResponses"):
            data.pop(k, None)
    p.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
PY
  elif [ -f "$SETTINGS" ]; then
    rm -f "$SETTINGS"
  fi
}

ask_key() {
  local preset="${1:-}"
  if [ -n "$preset" ]; then
    printf '%s' "$preset"
    return
  fi
  local out=""
  if [ -t 0 ] && [ -r /dev/tty ]; then
    read -r -s -p "API key (sk-...): " out </dev/tty
    echo >&2
  fi
  printf '%s' "$out"
}

do_apply() {
  local key="$1"
  key="$(printf '%s' "$key" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
  if [ -z "$key" ] || [ "${#key}" -lt 8 ] || [[ "$key" == *YOUR_API_KEY* ]]; then
    say "Key không hợp lệ."
    exit 1
  fi
  write_claude_code "$key"
  say "Đã ghi ~/.claude/settings.json"
  say "Claude Code CLI: chạy lại 'claude' (hoặc /model nghi/claude-sonnet-5[1m])."
  say "VS Code / Cursor: Ctrl+Shift+P → Reload Window."
  say "Log: $LOG"
}

do_reset() {
  reset_all
  say "Đã reset cấu hình Claude Code trên máy này."
}

# --- main ---
ARG1="${1:-}"
case "$ARG1" in
  --reset|-r)
    do_reset
    exit 0
    ;;
  sk-*|*)
    if [ -n "$ARG1" ] && [[ "$ARG1" == sk-* ]]; then
      do_apply "$ARG1"
      exit 0
    fi
    ;;
esac

echo ""
echo "  Claude Key Tool (Linux) v${VERSION}"
echo "  Gateway: ${GATEWAY}"
echo ""
echo "  1) Áp dụng key"
echo "  2) Reset cấu hình"
echo "  3) Thoát"
read -r -p "Chọn [1]: " choice </dev/tty 2>/dev/null || choice="1"
case "${choice:-1}" in
  2)
    do_reset
    ;;
  3)
    exit 0
    ;;
  *)
    key="$(ask_key "")"
    do_apply "$key"
    ;;
esac
