#!/usr/bin/env bash
# Noobax — instalación en un servidor nuevo con solo la clave de licencia:
#
#   curl -fsSL https://get.noobax.com | sudo bash
#
# Pide la clave, obtiene del proveedor el acceso a las imágenes de la versión
# que cubre la licencia, la descarga y corre su propio install.sh (Docker,
# licencia, dominio, correo, organización, certificado). NOOBAX_DIR cambia la
# carpeta de la instalación (por defecto /opt/noobax).
#
# Servido por el Control Panel (modules/licensing/install/get-noobax.sh).
set -euo pipefail
INSTALL_URL="https://get.noobax.com"
DIR="${NOOBAX_DIR:-/opt/noobax}"

say() { printf '%s\n' "$*"; }
fail() { printf '\nError: %s\n' "$*" >&2; exit 1; }
# Campo de texto de una respuesta JSON (sin jq).
json_field() { printf '%s' "$1" | sed -n "s/.*\"$2\":\"\([^\"]*\)\".*/\1/p" | head -n1; }

[ "$(id -u)" = "0" ] || fail "corre el instalador como root: curl -fsSL ${INSTALL_URL} | sudo bash"
# Este script llega por la tubería: las respuestas se leen de la terminal.
exec 3</dev/tty || fail "se necesita una terminal interactiva (ssh al servidor)"
[ ! -f "$DIR/.env" ] || fail "ya hay una instalación en ${DIR}: para actualizar usa ${DIR}/manage.sh"

printf '\n\033[1m=== Instalación de Noobax ===\033[0m\n\n'

# --- Docker ------------------------------------------------------------------
if ! command -v docker >/dev/null 2>&1; then
  say "==> Instalando Docker..."
  curl -fsSL https://get.docker.com | sh
  systemctl enable --now docker >/dev/null 2>&1 || true
fi
docker compose version >/dev/null 2>&1 || fail "Docker no tiene el plugin 'docker compose' (paquete docker-compose-plugin)"

# --- Huella del servidor (mismo cálculo que el backend: machine-identity.ts) ---
machine_id=""
for file in /etc/machine-id /var/lib/dbus/machine-id; do
  if [ -s "$file" ]; then machine_id="$(tr -d '[:space:]' < "$file" | tr '[:upper:]' '[:lower:]')"; break; fi
done
if [ -z "$machine_id" ]; then
  systemd-machine-id-setup >/dev/null 2>&1 || od -An -N16 -tx1 /dev/urandom | tr -d ' \n' > /etc/machine-id
  machine_id="$(tr -d '[:space:]' < /etc/machine-id | tr '[:upper:]' '[:lower:]')"
fi
product_uuid=""
if [ -r /sys/class/dmi/id/product_uuid ]; then product_uuid="$(tr -d '[:space:]' < /sys/class/dmi/id/product_uuid | tr '[:upper:]' '[:lower:]')"; fi
FINGERPRINT="$(printf 'noobax:v1|%s|%s' "$machine_id" "$product_uuid" | sha256sum | cut -d' ' -f1)"

# --- Licencia → acceso a las imágenes --------------------------------------------
while true; do
  read -r -u 3 -p "Clave de licencia (NBX-...): " KEY
  KEY="$(printf '%s' "$KEY" | tr -d '[:space:]' | tr '[:lower:]' '[:upper:]')"
  [ -n "$KEY" ] || continue
  response="$(curl -sS -X POST "${INSTALL_URL}/api/public/licensing/registry-access" \
    -H 'content-type: application/json' \
    -d "{\"licenseKey\":\"${KEY}\",\"fingerprint\":\"${FINGERPRINT}\"}" -w $'\n%{http_code}')" \
    || fail "no se pudo contactar ${INSTALL_URL}: revisa la conexión a internet del servidor"
  status="${response##*$'\n'}"
  body="${response%$'\n'*}"
  [ "$status" = "200" ] && break
  case "$(json_field "$body" code)" in
    license_not_found) say "  Esa clave no existe. Revísala e inténtalo de nuevo." ;;
    license_revoked) fail "la licencia fue revocada: contacta a tu proveedor." ;;
    license_suspended) fail "la licencia está suspendida: contacta a tu proveedor." ;;
    license_expired) fail "la licencia terminó su período de uso: contacta a tu proveedor." ;;
    no_version_available) fail "no hay una versión publicada que cubra tu licencia: contacta a tu proveedor." ;;
    *) fail "el servidor de licencias respondió ${status}: $(json_field "$body" message)" ;;
  esac
done

REGISTRY="$(json_field "$body" registry)"
IMAGE="$(json_field "$body" image)"
VERSION="$(json_field "$body" version)"
printf '%s' "$(json_field "$body" password)" | docker login "$REGISTRY" -u "$(json_field "$body" username)" --password-stdin >/dev/null 2>&1 \
  || fail "no se pudo iniciar sesión en el registry de imágenes; contacta a tu proveedor."

# --- La versión: sus scripts vienen en la imagen base-kit -------------------------
say "==> Descargando Noobax ${VERSION}..."
docker pull -q "${IMAGE}/base-kit:${VERSION}" >/dev/null
mkdir -p "$DIR"
cid="$(docker create "${IMAGE}/base-kit:${VERSION}" true)"
docker cp "${cid}:/kit/." "${DIR}/" >/dev/null
docker rm "$cid" >/dev/null

cd "$DIR"
say "==> Instalando en ${DIR}"
# install.sh: registry ya autenticado, licencia ya elegida; el resto (dominio,
# correo, organización, certificado) lo pregunta él, por la terminal.
export REGISTRY_LOGGED_IN=1 LICENSE_KEY="$KEY" NOOBAX_PORTAL_URL="$INSTALL_URL"
exec ./install.sh <&3
