#!/usr/bin/env bash
# ============================================================
#  Agente Pessoal — CHECAGEM DE PRONTIDÃO
#  Rode ISTO na SUA VPS, ANTES do dia da instalação:
#     curl -fsSL <URL>/checar.sh | bash
#  Ele confere se está tudo pronto e imprime uma linha
#  "PRONTIDAO:" pra você colar no grupo.
#  Não instala o agente. Não muda nada importante.
# ============================================================
set -uo pipefail

VERSAO="1.0"
OK=0; FALTA=0
PENDENCIAS=()
DETALHES=()

# curl | bash: o stdin é o próprio script, então toda pergunta
# precisa ler do terminal de verdade.
if { : < /dev/tty; } 2>/dev/null; then TTY_OK=1; else TTY_OK=0; fi
perguntar() { # perguntar VAR "texto" [-s]
  local __var="$1" __txt="$2" __silent="${3:-}" __resp=""
  if [ "$TTY_OK" = "1" ]; then
    if [ "$__silent" = "-s" ]; then
      read -rsp "$__txt" __resp < /dev/tty; echo
    else
      read -rp "$__txt" __resp < /dev/tty
    fi
  fi
  printf -v "$__var" '%s' "$__resp"
}

bom()  { OK=$((OK+1));       echo "   [ OK ]  $1"; }
ruim() { FALTA=$((FALTA+1)); echo "   [FALTA] $1"; PENDENCIAS+=("$2"); }
aviso(){ echo "   [ !  ]  $1"; }

echo "============================================================"
echo "  CHECAGEM DE PRONTIDÃO — Agente Pessoal (v$VERSAO)"
echo "============================================================"
echo

# ------------------------------------------------------------
# 1. Está rodando no lugar certo? (Linux, não no seu Mac/PC)
# ------------------------------------------------------------
echo ">> 1/8  Onde estou rodando"
if [ "$(uname -s)" != "Linux" ]; then
  echo
  echo "   PARE. Isto aqui não é o servidor, é o seu próprio computador."
  echo "   Conecte no servidor primeiro:   ssh root@SEU_IP"
  echo "   e rode este comando de novo lá dentro."
  exit 1
fi
DISTRO="desconhecido"
[ -r /etc/os-release ] && . /etc/os-release && DISTRO="${PRETTY_NAME:-$ID $VERSION_ID}"
case "${VERSION_ID:-}" in
  22.04|24.04) bom "Sistema: $DISTRO" ;;
  *) if [ "${ID:-}" = "ubuntu" ]; then
       aviso "Sistema: $DISTRO (o testado é 22.04 ou 24.04; deve funcionar, avise no grupo)"
       OK=$((OK+1))
     else
       ruim "Sistema: $DISTRO — o kit é feito pra Ubuntu 22.04/24.04" \
            "servidor não é Ubuntu 22.04/24.04"
     fi ;;
esac
DETALHES+=("$DISTRO")

# ------------------------------------------------------------
# 2. Sou root?
# ------------------------------------------------------------
echo ">> 2/8  Permissão"
if [ "$(id -u)" = "0" ]; then
  bom "Você está como root"
else
  ruim "Você não está como root (entre com: ssh root@SEU_IP)" "não está como root"
fi

# ------------------------------------------------------------
# 3. Memória
# ------------------------------------------------------------
echo ">> 3/8  Memória"
RAM_MB=$(awk '/MemTotal/{print int($2/1024)}' /proc/meminfo 2>/dev/null || echo 0)
RAM_GB=$(awk -v m="$RAM_MB" 'BEGIN{printf "%.1f", m/1024}')
if [ "$RAM_MB" -ge 3500 ]; then
  bom "RAM: ${RAM_GB}GB"
elif [ "$RAM_MB" -ge 1800 ]; then
  aviso "RAM: ${RAM_GB}GB (funciona, mas o recomendado é 4GB — plano KVM 2)"
  OK=$((OK+1))
else
  ruim "RAM: ${RAM_GB}GB — pouco. Precisa de pelo menos 2GB (recomendado 4GB)" \
       "RAM insuficiente (${RAM_GB}GB)"
fi
DETALHES+=("${RAM_GB}GB RAM")

# ------------------------------------------------------------
# 4. Disco
# ------------------------------------------------------------
echo ">> 4/8  Disco"
DISCO_GB=$(df -BG --output=avail / 2>/dev/null | tail -1 | tr -dc '0-9')
DISCO_GB=${DISCO_GB:-0}
if [ "$DISCO_GB" -ge 10 ]; then
  bom "Espaço livre: ${DISCO_GB}GB"
else
  ruim "Espaço livre: ${DISCO_GB}GB — precisa de pelo menos 10GB" \
       "disco quase cheio (${DISCO_GB}GB livres)"
fi

# ------------------------------------------------------------
# 5. Internet do servidor
# ------------------------------------------------------------
echo ">> 5/8  Internet do servidor"
NET_FALHOU=""
# Basta o servidor CONSEGUIR FALAR com cada endereço. Alguns respondem
# 403/404 pra requisição crua (normal) — o que importa é não dar 000.
for alvo in https://registry.npmjs.org https://api.telegram.org https://auth.openai.com; do
  CODIGO=$(curl -s -o /dev/null -m 15 -w '%{http_code}' "$alvo" 2>/dev/null || echo 000)
  [ "$CODIGO" = "000" ] && NET_FALHOU="$NET_FALHOU $alvo"
done
if [ -z "$NET_FALHOU" ]; then
  bom "O servidor alcança npm, Telegram e OpenAI"
else
  ruim "O servidor não alcançou:$NET_FALHOU" "sem acesso a:$NET_FALHOU"
fi

# ------------------------------------------------------------
# 6. tmux (rede de segurança: instalação sobrevive à queda da conexão)
# ------------------------------------------------------------
echo ">> 6/8  tmux"
if command -v tmux >/dev/null 2>&1; then
  bom "tmux instalado"
else
  echo "   tmux não está instalado. Instalando (leva ~20s)..."
  DEBIAN_FRONTEND=noninteractive apt-get update -qq >/dev/null 2>&1
  DEBIAN_FRONTEND=noninteractive apt-get install -y -qq tmux >/dev/null 2>&1
  if command -v tmux >/dev/null 2>&1; then
    bom "tmux instalado agora"
  else
    ruim "não consegui instalar o tmux" "tmux não instalou"
  fi
fi

# ------------------------------------------------------------
# 7. Bot do Telegram (validação de verdade, contra a API)
# ------------------------------------------------------------
echo ">> 7/8  Bot do Telegram"
BOT_USER=""
if [ "$TTY_OK" = "0" ]; then
  aviso "sem terminal interativo — pulei a checagem do bot"
  PENDENCIAS+=("bot do Telegram não verificado")
  FALTA=$((FALTA+1))
else
  perguntar TGTOKEN "   Cole o token do bot (do @BotFather): " -s
  perguntar TGID    "   Seu user_id numérico (do @userinfobot): "
  if [ -n "${TGTOKEN:-}" ]; then
    RESP=$(curl -fsS --max-time 15 "https://api.telegram.org/bot${TGTOKEN}/getMe" 2>/dev/null || echo "")
    BOT_USER=$(printf '%s' "$RESP" | grep -o '"username":"[^"]*"' | head -1 | cut -d'"' -f4)
  fi
  if [ -n "$BOT_USER" ]; then
    bom "Bot válido: @$BOT_USER"
  else
    ruim "Token do bot não respondeu (confira no @BotFather e rode de novo)" "token do bot inválido"
  fi
  if printf '%s' "${TGID:-}" | grep -qE '^[0-9]{5,}$'; then
    bom "user_id com cara de válido: $TGID"
  else
    ruim "user_id inválido (tem que ser só números, do @userinfobot)" "user_id inválido"
  fi
fi

# ------------------------------------------------------------
# 8. Cérebro (Codex / ChatGPT Plus) — declarado por você
# ------------------------------------------------------------
echo ">> 8/8  Cérebro (ChatGPT Plus)"
PLUS="não informado"
if [ "$TTY_OK" = "1" ]; then
  perguntar R "   Sua assinatura ChatGPT Plus está ATIVA e logada no navegador do seu computador? [s/n]: "
  case "${R:-}" in
    s|S|sim|SIM|y|Y) PLUS="sim"; bom "ChatGPT Plus confirmado por você" ;;
    *) PLUS="não"; ruim "sem ChatGPT Plus ativo o agente fica sem cérebro" "ChatGPT Plus não confirmado" ;;
  esac
else
  aviso "sem terminal interativo — não perguntei do ChatGPT Plus"
fi

# ------------------------------------------------------------
# Guarda os dados pro dia da instalação (só nesta VPS, só root)
# ------------------------------------------------------------
if [ "$TTY_OK" = "1" ] && [ "$(id -u)" = "0" ]; then
  perguntar NOME_PESSOA "   Como o agente deve te chamar: "
  perguntar NOME_AGENTE "   Que nome você quer dar ao agente: "
  umask 077
  {
    echo "# Gerado pela checagem de prontidão — guarde, você usa isto no dia da instalação"
    echo "NOME=\"${NOME_PESSOA:-}\""
    echo "AGENT_NAME=\"${NOME_AGENTE:-}\""
    echo "TELEGRAM_BOT_TOKEN=\"${TGTOKEN:-}\""
    echo "TELEGRAM_USER_ID=\"${TGID:-}\""
    echo "BOT_USERNAME=\"${BOT_USER:-}\""
  } > /root/prontidao.env
  chmod 600 /root/prontidao.env
  echo
  echo "   Seus dados ficaram salvos em /root/prontidao.env (só você lê)."
  echo "   No dia, se esquecer algo:  cat /root/prontidao.env"
fi

# ------------------------------------------------------------
# Veredito
# ------------------------------------------------------------
TOTAL=$((OK+FALTA))
echo
echo "============================================================"
if [ "$FALTA" -eq 0 ]; then
  echo "  TUDO PRONTO ($OK/$TOTAL)"
  echo
  echo "  Cole a linha abaixo no grupo:"
  echo
  echo "PRONTIDAO: OK $OK/$TOTAL | ${DETALHES[0]:-} | ${DETALHES[1]:-} | bot @${BOT_USER:-?} | Plus: $PLUS"
else
  echo "  FALTOU $FALTA ITEM(NS)"
  echo
  echo "  Resolva e rode a checagem de novo. Pendências:"
  for p in "${PENDENCIAS[@]}"; do echo "    - $p"; done
  echo
  echo "  Se travar, cole a linha abaixo no grupo (com print, se puder):"
  echo
  P_STR=$(printf '%s; ' "${PENDENCIAS[@]}")
  echo "PRONTIDAO: FALTA $FALTA | ${P_STR%; }"
fi
echo "============================================================"
