#!/usr/bin/env bash
# =============================================================================
# Instala Node.js + Playwright/Chromium no SERVIDOR (Ubuntu/Debian) para capturar
# o gráfico "Perfil de Desempenho" usado no relatório ARS (DOCX).
#
# SERVIDOR DE PRODUÇÃO COMPARTILHADO — regras deste script:
#   - Node NÃO vem do apt (nem npm do apt): tarball oficial em /opt, fora do PATH,
#     com SHA256 conferido. O PHP já procura /opt/node*/bin/node.
#   - apt só para as bibliotecas que o Chromium exige e que FALTAM, sempre com
#     --no-install-recommends, depois de SIMULAR e mostrar a lista.
#   - Recusa ATUALIZAR pacotes já instalados (ex.: glib), salvo ARS_PERMITIR_UPGRADE=1.
#   - needrestart suspenso (NEEDRESTART_SUSPEND=1, NEEDRESTART_MODE=l): nenhum
#     serviço (Apache, MySQL...) é reiniciado automaticamente.
#   - Nada é instalado sem confirmação ("sim") ou ARS_CONFIRMAR=sim.
#
# Uso (root):
#   bash instalar-playwright.sh
#   ARS_TESTE_CONTEXTO=<id> ARS_TESTE_APLICACAO=<id> bash instalar-playwright.sh   # com teste
# =============================================================================
set -euo pipefail

NODE_VERSION="v20.20.2"
NODE_DIST="node-${NODE_VERSION}-linux-x64"
NODE_URL="https://nodejs.org/dist/${NODE_VERSION}"

APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
CHART_DIR="$APP_DIR/charts/perfil-desempenho"
BASE_URL="${ARS_BASE_URL:-https://app.accia.com.br}"

export DEBIAN_FRONTEND=noninteractive
export NEEDRESTART_SUSPEND=1
export NEEDRESTART_MODE=l
export PLAYWRIGHT_BROWSERS_PATH=/ms-playwright

echo "==> Diretório do app: $APP_DIR"
echo "==> Diretório do chart : $CHART_DIR"

if [ "$(id -u)" -ne 0 ]; then
  echo "ERRO: rode como root." >&2
  exit 1
fi

confirmar() {
  [ "${ARS_CONFIRMAR:-}" = "sim" ] && return 0
  printf '%s Digite "sim" para continuar: ' "$1"
  read -r resp
  [ "$resp" = "sim" ] || { echo "Cancelado. Nada foi instalado nesta etapa."; exit 1; }
}

echo "==> (1/5) Node.js (tarball oficial ${NODE_VERSION} em /opt, sem apt)..."
NODE_BIN="/opt/${NODE_DIST}/bin"
if [ ! -x "$NODE_BIN/node" ]; then
  confirmar "Vai baixar ${NODE_URL}/${NODE_DIST}.tar.xz e extrair em /opt/${NODE_DIST}."
  TMP_NODE="$(mktemp -d)"
  curl -fsSLo "$TMP_NODE/${NODE_DIST}.tar.xz" "${NODE_URL}/${NODE_DIST}.tar.xz"
  curl -fsSLo "$TMP_NODE/SHASUMS256.txt" "${NODE_URL}/SHASUMS256.txt"
  (cd "$TMP_NODE" && grep " ${NODE_DIST}.tar.xz\$" SHASUMS256.txt | sha256sum -c -)
  tar -xJf "$TMP_NODE/${NODE_DIST}.tar.xz" -C /opt
  rm -rf "$TMP_NODE"
fi
export PATH="$NODE_BIN:$PATH"
echo "    node: $(node -v) ($NODE_BIN/node)"

echo "==> (2/5) Dependências npm (versões fixadas no package-lock)..."
cd "$CHART_DIR"
npm ci --no-audit --no-fund
chmod -R a+rX "$CHART_DIR/node_modules"

echo "==> (3/5) Bibliotecas de sistema do Chromium (simulação antes de instalar)..."
apt-get update -y >/dev/null
DRYRUN="$(npx playwright install-deps --dry-run chromium 2>&1 || true)"
if echo "$DRYRUN" | grep -q "All system dependencies are installed"; then
  FALTANDO=""
elif echo "$DRYRUN" | grep -q "^Missing system dependencies"; then
  FALTANDO="$(echo "$DRYRUN" | awk '/^  [a-z0-9]/{print $1}')"
else
  echo "ERRO: simulação do Playwright falhou:" >&2
  echo "$DRYRUN" >&2
  exit 1
fi
if [ -z "$FALTANDO" ]; then
  echo "    Nenhuma biblioteca faltando — apt não será executado."
else
  # shellcheck disable=SC2086
  SIMULACAO="$(apt-get install -s --no-install-recommends $FALTANDO)"
  NOVOS="$(echo "$SIMULACAO" | awk '/^Inst / && $3 !~ /^\[/ {print "    + " $2}')"
  UPGRADES="$(echo "$SIMULACAO" | awk '/^Inst / && $3 ~ /^\[/ {print "    ^ " $2 " " $3 " -> " $4}')"
  echo "    Pacotes NOVOS:"; echo "${NOVOS:-    (nenhum)}"
  echo "    Pacotes que seriam ATUALIZADOS:"; echo "${UPGRADES:-    (nenhum)}"
  if [ -n "$UPGRADES" ] && [ "${ARS_PERMITIR_UPGRADE:-}" != "1" ]; then
    echo "ERRO: a instalação atualizaria pacotes já instalados (lista acima)." >&2
    echo "      Avalie o impacto e, se aceitável, rode de novo com ARS_PERMITIR_UPGRADE=1." >&2
    exit 1
  fi
  confirmar "Instalar os pacotes acima (needrestart suspenso: nenhum serviço será reiniciado)?"
  # shellcheck disable=SC2086
  apt-get install -y --no-install-recommends $FALTANDO
fi

echo "==> (4/5) Chromium do Playwright em /ms-playwright (download, sem apt)..."
mkdir -p /ms-playwright
npx playwright install chromium
chmod -R a+rX /ms-playwright
node -e "console.log('    playwright', require('playwright/package.json').version)"

echo "==> (5/5) Teste de captura..."
if [ -n "${ARS_TESTE_CONTEXTO:-}" ] && [ -n "${ARS_TESTE_APLICACAO:-}" ]; then
  TOKEN=$(php -r "echo md5('gledson' . date('dmY'));")
  OUT="/tmp/perfil_${ARS_TESTE_CONTEXTO}.png"
  sudo -u www-data env PLAYWRIGHT_BROWSERS_PATH=/ms-playwright "$NODE_BIN/node" capture.js \
    --url "${BASE_URL}/site/grafico-perfil-desempenho-coleta-token?token=${TOKEN}&contexto_id=${ARS_TESTE_CONTEXTO}&aplicacao_id=${ARS_TESTE_APLICACAO}" \
    --out "$OUT" \
    --width 1280 --height 720 --dsf 2 --wait 4500
  echo "PNG gerado: $OUT ($(stat -c%s "$OUT" 2>/dev/null || echo '?') bytes)"
else
  echo "    (pulado: defina ARS_TESTE_CONTEXTO e ARS_TESTE_APLICACAO para testar)"
fi

echo ""
echo "Serviços que precisariam de restart (NÃO reiniciados por este script):"
needrestart -r l -b 2>/dev/null | grep '^NEEDRESTART-SVC' || echo "    (nenhum)"
echo "Diagnóstico da captura feita pelo PHP: $APP_DIR/runtime/ars/playwright_last.log"
