#!/bin/sh
# Verinet — instalador para Linux.
#
#   curl -fsSL https://app.verinet.es/install.sh | bash
#   curl -fsSL https://app.verinet.es/install.sh | sh
#   curl -fsSL https://app.verinet.es/install.sh | sudo bash
#
# Se instala a nivel de sistema (/opt/verinet, /etc/pam.d/verinet y la regla
# polkit), así que necesita permisos de administrador: si no eres root se usa
# sudo (o pkexec si no hay sudo). El paquete nativo (apt/dnf) resuelve las
# dependencias.
#
# Script POSIX sh a propósito: `curl | sh` en Debian/Ubuntu ejecuta dash.
#
# Opciones:
#   --version V     versión a instalar        (def. 1.55.0)
#   --base-url U    base de descarga          (def. https://app.verinet.es)
#   --uninstall     desinstala Verinet
#   --dry-run       muestra lo que haría, sin descargar ni instalar
#   -h, --help      esta ayuda
#
# Variables de entorno: VERINET_VERSION, VERINET_BASE_URL

set -eu

DEFAULT_VERSION='1.55.0'
DEFAULT_BASE_URL='https://app.verinet.es'

APP_VERSION="${VERINET_VERSION:-$DEFAULT_VERSION}"
BASE_URL="${VERINET_BASE_URL:-$DEFAULT_BASE_URL}"
DRY_RUN=0
UNINSTALL=0

log() { printf '%s\n' "$*" >&2; }
die() { printf 'error: %s\n' "$*" >&2; exit 1; }

usage() {
    cat <<'EOF'
Verinet — instalador Linux

Uso:
  curl -fsSL https://app.verinet.es/install.sh | sh
  curl -fsSL https://app.verinet.es/install.sh | sudo sh

Opciones:
  --version V     versión a instalar        (def. 1.55.0)
  --base-url U    base de descarga          (def. https://app.verinet.es)
  --uninstall     desinstalar Verinet
  --dry-run       mostrar acciones sin ejecutarlas
  -h, --help      esta ayuda
EOF
}

while [ $# -gt 0 ]; do
    case "$1" in
        --version)
            [ $# -ge 2 ] || die "--version necesita un valor"
            APP_VERSION="$2"
            shift 2
            ;;
        --version=*) APP_VERSION="${1#*=}"; shift ;;
        --base-url)
            [ $# -ge 2 ] || die "--base-url necesita un valor"
            BASE_URL="$2"
            shift 2
            ;;
        --base-url=*) BASE_URL="${1#*=}"; shift ;;
        --uninstall) UNINSTALL=1; shift ;;
        --dry-run) DRY_RUN=1; shift ;;
        -h|--help) usage; exit 0 ;;
        --) shift; break ;;
        -*) die "opción desconocida: $1" ;;
        *) die "argumento inesperado: $1" ;;
    esac
done

# --- distribución y arquitectura -------------------------------------------

[ -r /etc/os-release ] || die "no se pudo leer /etc/os-release"
# shellcheck disable=SC1091
. /etc/os-release

case " ${ID:-} ${ID_LIKE:-} " in
    *debian*|*ubuntu*) FAMILY=deb ;;
    *fedora*|*rhel*|*centos*) FAMILY=rpm ;;
    *) die "distribución no soportada (${ID:-desconocida}); solo .deb (Debian/Ubuntu) o .rpm (Fedora/RHEL)" ;;
esac

case "$(uname -m)" in
    x86_64|amd64) ;;
    *) die "arquitectura no soportada ($(uname -m)); solo x86_64" ;;
esac

# --- escalada de privilegios ------------------------------------------------
# sudo primero (funciona en cualquier terminal, lee de /dev/tty) y pkexec como
# fallback (necesita un agente polkit; en un SSH sin escritorio no hay).

if [ "$(id -u)" -eq 0 ]; then
    PRIV=''
elif command -v sudo >/dev/null 2>&1; then
    PRIV=sudo
elif command -v pkexec >/dev/null 2>&1; then
    PRIV=pkexec
else
    die "se necesitan permisos de administrador y no hay ni sudo ni pkexec"
fi

# Ejecuta como root. No toca stdin: con `curl | sh` el script viene por stdin.
as_root() {
    if [ -z "$PRIV" ]; then
        "$@"
    else
        "$PRIV" "$@"
    fi
}

# --- desinstalar ------------------------------------------------------------

if [ "$UNINSTALL" -eq 1 ]; then
    if [ "$DRY_RUN" -eq 1 ]; then
        log "(dry-run) desinstalaría el paquete verinet"
        exit 0
    fi
    log "Desinstalando Verinet…"
    case "$FAMILY" in
        deb) as_root env DEBIAN_FRONTEND=noninteractive apt-get remove -y verinet ;;
        rpm) as_root dnf remove -y verinet ;;
    esac
    exit 0
fi

# --- descarga ---------------------------------------------------------------

PKG="verinet-linux-x64-${APP_VERSION}.${FAMILY}"
PKG_URL="${BASE_URL%/}/linux/${PKG}"

if [ "$FAMILY" = deb ]; then
    command -v apt-get >/dev/null 2>&1 || die "apt-get no encontrado"
else
    command -v dnf >/dev/null 2>&1 || die "dnf no encontrado"
fi

if [ "$DRY_RUN" -eq 1 ]; then
    log "(dry-run) descargaría $PKG_URL e instalaría $PKG"
    exit 0
fi

if command -v curl >/dev/null 2>&1; then
    fetch() { curl -fL --retry 3 --connect-timeout 15 -o "$2" "$1"; }
elif command -v wget >/dev/null 2>&1; then
    fetch() { wget -O "$2" "$1"; }
else
    die "falta curl o wget para descargar el paquete"
fi

TMP="$(mktemp -d "${TMPDIR:-/tmp}/verinet.XXXXXX")"
trap 'rm -rf "$TMP"' EXIT HUP INT TERM

log "Descargando $PKG_URL"
fetch "$PKG_URL" "$TMP/$PKG" || die "no se pudo descargar $PKG_URL"

# --- instalar ---------------------------------------------------------------

log "Instalando $PKG (pide permisos de administrador)…"
case "$FAMILY" in
    deb) as_root env DEBIAN_FRONTEND=noninteractive apt-get install -y "$TMP/$PKG" ;;
    rpm) as_root dnf install -y "$TMP/$PKG" ;;
esac

log "Verinet ${APP_VERSION} instalado. Ábrela desde el menú (Verinet) o ejecuta: verinet"
