#!/usr/bin/env bash
# =====================================================================
# Aplica roles, vistas y verificación del agente en un server (test o prod).
# Corre en el server, como root (usa `su postgres`, autenticación peer).
#
#   scp -r db <server>:/tmp/soporte-ia-db
#   ssh <server> 'bash /tmp/soporte-ia-db/aplicar-en-servidor.sh <base> && rm -rf /tmp/soporte-ia-db'
#
#   <base>: novasiserp (test) o smartfactpy (prod)
#
# La contraseña de soporte_ia se genera EN el server la primera vez y queda en
# /root/.soporte_ia_pw (600): de ahí sale ERP_DATABASE_URL del servicio. La clave
# que firma el alcance (soporte_ro.alcance_firmado) también, en
# /root/.soporte_alcance_secreto (600): es SOPORTE_ALCANCE_SECRETO del servicio.
# Ninguna pasa por la línea de comandos ni por los argumentos de un proceso.
# Idempotente: se puede volver a correr (por ejemplo, después de §5.4 del plan).
# =====================================================================
set -euo pipefail

BASE="${1:?Uso: aplicar-en-servidor.sh <base>}"
DIR="$(cd "$(dirname "$0")" && pwd)"
PW_FILE=/root/.soporte_ia_pw
CLAVE_FILE=/root/.soporte_alcance_secreto

if [ ! -s "$PW_FILE" ]; then
  (umask 077 && openssl rand -hex 24 > "$PW_FILE")
  echo "Contraseña nueva de soporte_ia guardada en $PW_FILE"
fi
if [ ! -s "$CLAVE_FILE" ]; then
  (umask 077 && openssl rand -hex 32 > "$CLAVE_FILE")
  echo "Clave nueva de firma del alcance guardada en $CLAVE_FILE"
fi

TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT
cp "$DIR/roles.sql" "$DIR/vistas/aplicar.sql" "$DIR/vistas/negocio.sql" "$DIR/vistas/verificar.sql" "$TMP/"
(umask 077 && printf "\\\\set soporte_ia_password %s\n\\\\set soporte_alcance_secreto %s\n" \
  "$(cat "$PW_FILE")" "$(cat "$CLAVE_FILE")" > "$TMP/pw.sql")
chown -R postgres "$TMP"
chmod 700 "$TMP"

psql_postgres() {
  su postgres -c "cd /tmp && psql -X -q -d '$BASE' $*"
}

# Cada paso corta si falla (antes un `|| true` tapaba el error de roles.sql y seguía).
paso() { # paso <título> <argumentos de psql>
  echo "== $1"
  local ok=0
  psql_postgres "$2" > "$TMP/salida.log" 2>&1 || ok=$?
  grep -v 'ya recibió\|ya existe\|already a member\|already exists' "$TMP/salida.log" || true
  [ "$ok" = 0 ] || { echo "FALLÓ: $1"; exit 1; }
}

paso "roles ($BASE)" "-f $TMP/pw.sql -f $TMP/roles.sql"
paso "vistas" "-f $TMP/aplicar.sql -f $TMP/negocio.sql"

echo "== verificación (todo debe dar t / ok:)"
psql_postgres "-f $TMP/verificar.sql" 2>&1
