#!/usr/bin/env bash
# Conserta o pareamento do Telegram no OpenClaw quando o assistente gravou
# escapes de teclado (setas) no lugar do numero de usuario.
#
# O que faz, nessa ordem:
#   1. confere se esta mesmo corrompido (se estiver certo, sai sem tocar em nada)
#   2. descobre o numero correto no arquivo de credenciais do proprio agente
#   3. faz backup do openclaw.json com data e hora
#   4. corrige os dois campos
#   5. reinicia o agente, se ele estiver rodando
#   6. confere o resultado
#
# Uso, na VPS:  curl -fsSL https://kit.evotero.com.br/consertar-allowfrom.sh | bash
#
# Se o numero certo nao estiver em lugar nenhum, o script NAO adivinha:
# ele explica o que faltou e sai sem alterar nada.

set -u

CONFIG="${OPENCLAW_CONFIG:-/root/.openclaw/openclaw.json}"
CREDS="${OPENCLAW_CREDS:-/root/.openclaw/credentials/telegram-default-allowFrom.json}"
SERVICO="${OPENCLAW_SERVICE:-openclaw-gateway}"

if [ ! -f "$CONFIG" ]; then
  echo "Nao achei a configuracao em $CONFIG."
  echo "Se teu agente esta em outro lugar, roda assim:"
  echo "  OPENCLAW_CONFIG=/caminho/openclaw.json bash <(curl -fsSL https://kit.evotero.com.br/consertar-allowfrom.sh)"
  exit 1
fi

BACKUP="${CONFIG}.bak-allowfrom-$(date +%Y%m%d-%H%M%S)"

python3 - "$CONFIG" "$CREDS" "$BACKUP" <<'PY'
import json, shutil, sys

config_path, creds_path, backup_path = sys.argv[1], sys.argv[2], sys.argv[3]

def sujo(valor, prefixo=""):
    """Valida pelo que o campo DEVE ser, nao pelo lixo que ele pode conter.

    O lixo do assistente as vezes e o caractere ESC de verdade, as vezes e a
    string literal \\u001b (seis caracteres). Cacar padrao de lixo erra;
    exigir o formato certo, nao.

    Certo: allowFrom = ["873248252"]  ·  ownerAllowFrom = ["telegram:873248252"]
    """
    if valor is None:
        return False          # ausente nao e corrompido
    if not isinstance(valor, list) or not valor:
        return True
    for item in valor:
        texto = str(item)
        if prefixo:
            if not texto.startswith(prefixo):
                return True
            texto = texto[len(prefixo):]
        if not texto.isdigit():
            return True
    return False

with open(config_path) as f:
    cfg = json.load(f)

telegram = (cfg.get("channels") or {}).get("telegram") or {}
comandos = cfg.get("commands") or {}
quebrados = [nome for nome, valor, prefixo in (
    ("allowFrom", telegram.get("allowFrom"), ""),
    ("ownerAllowFrom", comandos.get("ownerAllowFrom"), "telegram:"),
) if sujo(valor, prefixo)]

if not quebrados:
    print("Nada a fazer: o pareamento ja esta correto.")
    raise SystemExit(0)

# o numero certo vem das credenciais do proprio agente; nao se inventa numero
try:
    with open(creds_path) as f:
        ids = [str(x).strip() for x in (json.load(f).get("allowFrom") or []) if str(x).strip()]
except Exception:
    ids = []

ids = [i for i in ids if i.isdigit()]
if not ids:
    print("Achei o problema, mas NAO achei o teu numero correto em %s." % creds_path)
    print("Nao vou adivinhar numero. Manda essa mensagem pro Duda que ele te ajuda.")
    raise SystemExit(2)

shutil.copy2(config_path, backup_path)

cfg.setdefault("channels", {}).setdefault("telegram", {})["allowFrom"] = ids
cfg.setdefault("commands", {})["ownerAllowFrom"] = ["telegram:%s" % i for i in ids]

with open(config_path, "w") as f:
    json.dump(cfg, f, indent=2, ensure_ascii=False)
    f.write("\n")

print("Corrigido: %s" % ", ".join(quebrados))
print("Backup do arquivo antigo: %s" % backup_path)
PY

resultado=$?
if [ "$resultado" -ne 0 ]; then
  exit "$resultado"
fi

# so reinicia se o agente estiver mesmo rodando; nao acorda o que estava parado
if systemctl is-active --quiet "$SERVICO" 2>/dev/null; then
  echo "Reiniciando o agente..."
  systemctl restart "$SERVICO" && sleep 5
  if systemctl is-active --quiet "$SERVICO"; then
    echo "Agente no ar de novo."
  else
    echo "ATENCAO: o agente nao voltou. Manda print pro Duda."
    exit 1
  fi
else
  echo "O agente esta parado, entao nao reiniciei nada."
fi

echo
echo "--- conferindo ---"
curl -fsSL https://kit.evotero.com.br/checar-allowfrom.sh 2>/dev/null | bash \
  || echo "(nao consegui rodar a conferencia agora, mas o conserto foi aplicado)"
