#!/usr/bin/env bash
#
# instalar_dependencias.sh
#
# Instala en Ubuntu/Debian lo necesario para que funcionen:
#
#     php cli.php login
#     php cli.php event <canal>
#
# en un servidor VPS sin pantalla. Chrome se ejecuta bajo un display virtual
# (Xvfb), porque reCAPTCHA v3 rechaza el modo headless.
#
# Uso:
#     sudo bash instalar_dependencias.sh
#
# Instala, solo si no estan ya:
#     - xvfb (xvfb-run)  + fuentes base
#     - Node.js >= 22    (via NodeSource)
#     - Google Chrome    (o Chromium como alternativa)
#     - php-<version>-curl
#
# Es idempotente y tolera repos de apt rotos ajenos al proyecto.

set -euo pipefail

log()  { printf '\033[1;34m[+]\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m[!]\033[0m %s\n' "$*"; }
err()  { printf '\033[1;31m[x]\033[0m %s\n' "$*" >&2; }

# --- Permisos ---------------------------------------------------------------
if [ "$(id -u)" -ne 0 ]; then
    if command -v sudo >/dev/null 2>&1; then
        log "Reejecutando con sudo..."
        exec sudo -E bash "$0" "$@"
    fi
    err "Ejecuta este script como root: sudo bash $0"
    exit 1
fi

# --- Comprobar distro -------------------------------------------------------
if [ ! -r /etc/os-release ]; then
    err "No encuentro /etc/os-release; este script es para Ubuntu/Debian."
    exit 1
fi
# shellcheck disable=SC1091
. /etc/os-release
case "${ID:-} ${ID_LIKE:-}" in
    *debian*|*ubuntu*) ;;
    *) err "Distribucion no soportada (${PRETTY_NAME:-desconocida}). Solo Ubuntu/Debian."; exit 1 ;;
esac
log "Distribucion: ${PRETTY_NAME:-desconocida}"

export DEBIAN_FRONTEND=noninteractive

have_apt() { dpkg -s "$1" >/dev/null 2>&1; }

install_apt() {
    for pkg in "$@"; do
        if have_apt "$pkg"; then
            log "ya instalado: $pkg"
        else
            log "instalando: $pkg"
            apt-get install -y --no-install-recommends "$pkg"
        fi
    done
}

# apt-get update puede fallar por repos ajenos rotos; no debe abortar el script.
soft_update() {
    if ! apt-get update -y; then
        warn "apt-get update reporto errores (hay repos rotos ajenos al proyecto)."
        warn "Revisa /etc/apt/sources.list y /etc/apt/sources.list.d/ si persisten."
    fi
}

log "Actualizando indices de apt..."
soft_update

# --- Limpiar repos NodeSource obsoletos (18.x, etc.) ------------------------
# Un node_18.x viejo responde 404 y ensucia apt.
shopt -s nullglob
for f in /etc/apt/sources.list.d/nodesource*.list /etc/apt/sources.list.d/nodesource*.sources; do
    if grep -q 'node_18\.x\|node_16\.x\|node_14\.x' "$f" 2>/dev/null; then
        log "Eliminando repo NodeSource obsoleto: $f"
        rm -f "$f"
    fi
done
shopt -u nullglob

# --- Clave de Google Chrome (si hay repo de Google configurado) -------------
if grep -rqs 'dl.google.com/linux/chrome' /etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/null; then
    if [ ! -e /usr/share/keyrings/google-chrome.gpg ] \
        && [ ! -e /etc/apt/trusted.gpg.d/google-chrome.gpg ] \
        && [ ! -e /etc/apt/trusted.gpg.d/google-chrome.asc ]; then
        log "Anadiendo clave de firma de Google Chrome..."
        install_apt gnupg curl >/dev/null 2>&1 || true
        if curl -fsSL https://dl.google.com/linux/linux_signing_key.pub \
            | gpg --dearmor -o /etc/apt/trusted.gpg.d/google-chrome.gpg 2>/dev/null; then
            chmod 0644 /etc/apt/trusted.gpg.d/google-chrome.gpg
        else
            warn "No pude instalar la clave de Google; se ignorara su repo."
        fi
    fi
fi

# --- Paquetes base (Xvfb + fuentes + utilidades) -----------------------------
install_apt ca-certificates curl gnupg wget xvfb fonts-liberation

# --- PHP: extension curl ----------------------------------------------------
if command -v php >/dev/null 2>&1; then
    PHP_VER="$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;' 2>/dev/null || true)"
    if php -m 2>/dev/null | grep -qi '^curl$'; then
        log "php-curl ya disponible (PHP ${PHP_VER:-?})"
    elif [ -n "$PHP_VER" ]; then
        install_apt "php${PHP_VER}-curl"
    else
        warn "No pude detectar la version de PHP; instala php-curl manualmente."
    fi
else
    warn "No encuentro 'php' en PATH. Instala php-cli y php-curl (ej: apt-get install -y php-cli php-curl)."
fi

# --- Node.js >= 22 ----------------------------------------------------------
NODE_OK=0
if command -v node >/dev/null 2>&1; then
    NODE_MAJOR="$(node -p 'process.versions.node.split(".")[0]' 2>/dev/null || echo 0)"
    if [ "$NODE_MAJOR" -ge 22 ] 2>/dev/null; then
        NODE_OK=1
        log "Node.js ya instalado: $(node -v)"
    else
        warn "Node.js $(node -v) es demasiado antiguo (se necesita >= 22)."
    fi
fi
if [ "$NODE_OK" -ne 1 ]; then
    log "Instalando Node.js 22 desde NodeSource..."
    if curl -fsSL https://deb.nodesource.com/setup_22.x | bash -; then
        soft_update
        apt-get install -y nodejs
        log "Node.js instalado: $(node -v)"
    else
        err "No pude configurar el repositorio de NodeSource. Instala Node.js >= 22 manualmente."
    fi
fi

# --- Chrome / Chromium ------------------------------------------------------
find_chrome() {
    for c in google-chrome google-chrome-stable chromium chromium-browser; do
        if command -v "$c" >/dev/null 2>&1; then
            command -v "$c"
            return 0
        fi
    done
    return 1
}

CHROME_BIN="$(find_chrome || true)"
if [ -n "$CHROME_BIN" ]; then
    log "Chrome/Chromium ya instalado: $CHROME_BIN"
else
    ARCH="$(dpkg --print-architecture)"
    if [ "$ARCH" = "amd64" ]; then
        log "Descargando Google Chrome Stable (amd64)..."
        TMP_DEB="$(mktemp --suffix=.deb)"
        wget -q -O "$TMP_DEB" https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
        log "Instalando Google Chrome (apt resuelve dependencias)..."
        apt-get install -y "$TMP_DEB"
        rm -f "$TMP_DEB"
    else
        warn "Arquitectura $ARCH: intento Chromium por apt..."
        apt-get install -y chromium || apt-get install -y chromium-browser
    fi
    CHROME_BIN="$(find_chrome || true)"
fi

# --- Verificacion -----------------------------------------------------------
echo
log "Verificacion:"
printf '  php        : %s\n' "$(command -v php || echo 'NO ENCONTRADO')"
printf '  php-curl   : %s\n' "$(php -m 2>/dev/null | grep -qi '^curl$' && echo 'OK' || echo 'FALTA')"
printf '  node       : %s\n' "$(node -v 2>/dev/null || echo 'NO ENCONTRADO')"
printf '  xvfb-run   : %s\n' "$(command -v xvfb-run || echo 'NO ENCONTRADO')"
printf '  chrome     : %s\n' "${CHROME_BIN:-NO ENCONTRADO}"
echo

if [ -z "${CHROME_BIN:-}" ]; then
    err "No se pudo instalar Chrome/Chromium. Revisa los mensajes anteriores."
    exit 1
fi
if ! command -v xvfb-run >/dev/null 2>&1; then
    err "Falta xvfb-run (paquete xvfb)."
    exit 1
fi
if ! command -v node >/dev/null 2>&1; then
    err "Falta Node.js."
    exit 1
fi

log "Todo listo."
