#!/usr/bin/env python3
"""
Configura o Claude Code (CLI + extensao do VS Code) para usar o Kiro Proxy local
como backend, via o endpoint compativel com a Anthropic Messages API
(POST /v1/messages) que o proxy expoe.

Como funciona:
  - O Claude Code fala o protocolo da Anthropic e respeita ANTHROPIC_BASE_URL.
  - Apontamos esse base URL para o proxy local (default http://localhost:3000).
  - O proxy traduz Anthropic <-> Kiro Web e responde no formato esperado.

Uso:
  python setup-claude.py
  python setup-claude.py --base-url http://localhost:3000
  python setup-claude.py --base-url http://192.168.0.10:3000 --api-key SEGREDO

Se o proxy estiver SEM API_KEY (padrao para uso local), basta dar Enter quando
pedir a chave — qualquer valor serve, pois o proxy nao valida.
"""

import argparse, getpass, json, os, re, shutil, subprocess, sys
from datetime import datetime
from pathlib import Path

CLAUDE_DIR = Path.home() / ".claude"
# URL de PRODUÇÃO do proxy. O cliente final aponta o Claude Code para o serviço
# hospedado; não há mais prompt de localhost (esse era só para desenvolvimento).
DEFAULT_BASE_URL = "https://bearfast.com.br"

# ─── Argumentos ────────────────────────────────────────────────────────────────
parser = argparse.ArgumentParser(description="Configura o Claude Code para usar o Claude (bearfast.com.br).")
parser.add_argument("--base-url", default=None, help=f"URL base do proxy (default {DEFAULT_BASE_URL})")
parser.add_argument("--api-key", default=None, help="Sua API key (kp_user_...). Obrigatória em produção.")
parser.add_argument("--model", default="auto", help="Modelo padrao (default 'auto').")
args = parser.parse_args()

# Em produção a URL é fixa (bearfast.com.br). Só permitimos trocar via flag
# explícita `--base-url` (para quem hospeda o próprio proxy); não perguntamos
# mais por localhost interativamente.
base_url = (args.base_url or DEFAULT_BASE_URL).rstrip("/")

if args.api_key is not None:
    api_key = args.api_key.strip()
else:
    api_key = getpass.getpass("Sua API Key (kp_user_...): ").strip()
# Em produção o proxy SEMPRE exige uma API key válida (cada usuário tem a sua,
# no formato kp_user_...). Sem ela o Claude Code recebe 401.
if not api_key:
    print("  [ERRO] Uma API key e obrigatoria em producao.")
    print("         Pegue a sua em https://bearfast.com.br (apos login, no")
    print("         modal de configuracao do Claude Code) e rode novamente:")
    print("         python setup-claude.py --api-key SUA_CHAVE")
    sys.exit(1)

CLAUDE_DIR.mkdir(parents=True, exist_ok=True)

def backup(path: Path):
    if path.exists() and path.stat().st_size > 0:
        ts = datetime.now().strftime("%Y%m%d%H%M%S")
        shutil.copy(path, f"{path}.backup.{ts}")

def write_json(path: Path, data: dict):
    path.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")

def read_json(path: Path) -> dict:
    try:
        return json.loads(path.read_text(encoding="utf-8"))
    except Exception:
        return {}

# ─── LIMPEZA ──────────────────────────────────────────────────────────────────
print("\n[LIMPEZA]")

creds_file = CLAUDE_DIR / ".credentials.json"
if creds_file.exists():
    creds_file.unlink()
    print("  [OK] Cache OAuth removido (.credentials.json)")
else:
    print("  [--] Sem cache OAuth")

try:
    subprocess.run(["claude", "logout"], capture_output=True, input=b"", timeout=10)
    print("  [OK] claude logout executado")
except Exception:
    print("  [--] claude logout ignorado")

if sys.platform == "win32":
    for var in ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN", "ANTHROPIC_BASE_URL"]:
        subprocess.run(["reg", "delete", "HKCU\\Environment", "/v", var, "/f"], capture_output=True)
    print("  [OK] Variaveis de ambiente antigas removidas")

# Detecta VS Code settings path
if sys.platform == "win32":
    appdata = os.environ.get("APPDATA") or str(Path.home() / "AppData" / "Roaming")
    vscode_settings = Path(appdata) / "Code" / "User" / "settings.json"
elif sys.platform == "darwin":
    vscode_settings = Path.home() / "Library" / "Application Support" / "Code" / "User" / "settings.json"
else:
    vscode_settings = Path.home() / ".config" / "Code" / "User" / "settings.json"

if vscode_settings.exists():
    vscode = read_json(vscode_settings)
    removed = [k for k in list(vscode.keys()) if k.startswith("claudeCode.") or k.startswith("claude-code.")]
    for k in removed:
        del vscode[k]
    if removed:
        write_json(vscode_settings, vscode)
        print(f"  [OK] Entradas antigas do VS Code removidas: {', '.join(removed)}")
    else:
        print("  [--] Sem entradas antigas no VS Code")

print()

# ─── 1. ~/.claude/settings.json ───────────────────────────────────────────────
# Para o CLI, ANTHROPIC_AUTH_TOKEN + ANTHROPIC_BASE_URL apontando para o proxy.
settings_file = CLAUDE_DIR / "settings.json"
backup(settings_file)

settings = {
    "$schema": "https://json.schemastore.org/claude-code-settings.json",
    "env": {
        "ANTHROPIC_BASE_URL":   base_url,
        "ANTHROPIC_AUTH_TOKEN": api_key,
        # Alguns builds do Claude Code leem a credencial apenas como API key;
        # manter os dois nomes evita que um ambiente Linux reutilize OAuth ou
        # uma variável antiga do shell.
        "ANTHROPIC_API_KEY":    api_key,
        # Desliga checagens de telemetria/onboarding que tentam falar com a Anthropic.
        "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
        # Popula o /model a partir do /v1/models do proxy (espelha o gateway).
        "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "1",
        # Mapeia os aliases padrao (opus/sonnet/haiku) para os ids REAIS que o
        # gateway expoe (descobertos via /v1/models). Usar ids que o gateway nao
        # conhece faz ele rotear pra um modelo fraco/errado e a sessao falha.
        "ANTHROPIC_DEFAULT_OPUS_MODEL":   "claude-opus-4-8",
        "ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4-6",
        "ANTHROPIC_DEFAULT_HAIKU_MODEL":  "claude-haiku-4-5",
        # Modelo pequeno/rapido para tarefas de fundo (titulos, etc.).
        "ANTHROPIC_SMALL_FAST_MODEL":     "claude-haiku-4-5",
        # Evita rejeicao de headers/campos beta da Anthropic pelo proxy.
        "CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1",
    },
    "model": args.model,
    "theme": "dark",
    "skipAutoPermissionPrompt": True,
}
write_json(settings_file, settings)
print(f"[OK] ~/.claude/settings.json -> {base_url}")

# ─── 2. ~/.claude/config.json ─────────────────────────────────────────────────
config_file = CLAUDE_DIR / "config.json"
backup(config_file)
write_json(config_file, {"primaryApiKey": api_key})
print("[OK] ~/.claude/config.json configurado")

# ─── 3. Variaveis de ambiente ─────────────────────────────────────────────────
if sys.platform == "win32":
    for k, v in [
        ("ANTHROPIC_AUTH_TOKEN", api_key),
        ("ANTHROPIC_API_KEY",    api_key),
        ("ANTHROPIC_BASE_URL",   base_url),
    ]:
        subprocess.run(["setx", k, v], capture_output=True)
    print("[OK] Variaveis de ambiente Windows (User) definidas")
else:
    export_block = (
        f'\n# Claude Code (Kiro Proxy)\n'
        f'export ANTHROPIC_AUTH_TOKEN="{api_key}"\n'
        f'export ANTHROPIC_API_KEY="{api_key}"\n'
        f'export ANTHROPIC_BASE_URL="{base_url}"\n'
    )
    block_pattern = re.compile(
        r'\n# Claude Code(?: \(Kiro Proxy\))?\nexport ANTHROPIC_AUTH_TOKEN="[^"]*"\n'
        r'export ANTHROPIC_API_KEY="[^"]*"\n'
        r'export ANTHROPIC_BASE_URL="[^"]*"\n',
        re.MULTILINE,
    )
    for rc in [Path.home() / ".zshrc", Path.home() / ".bashrc"]:
        if not rc.exists():
            rc.touch()
        content = rc.read_text(encoding="utf-8")
        content = block_pattern.sub("", content)
        rc.write_text(content + export_block, encoding="utf-8")
    print("[OK] Variaveis exportadas em ~/.zshrc e ~/.bashrc")

# ─── 4. VS Code settings.json ─────────────────────────────────────────────────
if vscode_settings.parent.exists():
    backup(vscode_settings)
    vscode = read_json(vscode_settings)
    vscode["claudeCode.disableLoginPrompt"]   = True
    vscode["claudeCode.preferredLocation"]    = "panel"
    vscode["claudeCode.environmentVariables"] = [
        {"name": "ANTHROPIC_BASE_URL", "value": base_url},
        {"name": "ANTHROPIC_API_KEY",  "value": api_key},
    ]
    write_json(vscode_settings, vscode)
    print("[OK] VS Code settings.json configurado")
else:
    print("[AVISO] VS Code nao encontrado, etapa ignorada.")

# ─── Conclusao ────────────────────────────────────────────────────────────────
print()
print("Configuracao concluida!")
print(f"  Backend:  {base_url}/v1/messages")
print(f"  Modelo:   {args.model}")
print()
print("IMPORTANTE: o Claude/CLI roda os comandos no SERVIDOR (nuvem), nao na")
print("sua maquina. Pedir para criar arquivos em D:\\... ou rodar git local")
print("NAO afeta o seu computador — use o chat para gerar codigo/textos e copie")
print("o resultado. E um assistente na nuvem, nao um agente do seu disco local.")
if sys.platform == "win32":
    print("Feche o VS Code com File > Exit e reabra (ou abra um terminal NOVO).")
else:
    print("Feche o VS Code com Cmd+Q e reabra (ou abra um terminal NOVO).")
print("Teste:  claude   depois:  /status")
