#!/bin/bash
# ─────────────────────────────────────────────────────────────────────────────
# device-install.sh — Installa test-kit su un dispositivo Pixsys "fresh"
# scaricando l'ultima release dal server di distribuzione.
#
# Da eseguire DIRETTAMENTE SUL DISPOSITIVO (non sulla workstation), come root:
#
#     sudo ./device-install.sh
#
# Cosa fa:
#   1. Usa la chiave SSH inclusa in ./auth/ (la chmod 600 al volo).
#   2. Scarica latest.json dal server di distribuzione.
#   3. Scarica il .run indicato dal manifest.
#   4. Verifica sha256.
#   5. Esegue il .run (self-extracting installer): installa e avvia
#      test-kit-launcher.service.
# ─────────────────────────────────────────────────────────────────────────────
set -euo pipefail

# ── Escalation a root ───────────────────────────────────────────────────────
if [ "$(id -u)" -ne 0 ]; then
    if command -v sudo >/dev/null 2>&1; then
        exec sudo "$(readlink -f "$0")" "$@"
    fi
    echo "Errore: serve root (sudo non disponibile)." >&2
    exit 1
fi

SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)"

# ── Config ──────────────────────────────────────────────────────────────────
UPDATE_SERVER="${PXR_UPDATE_SERVER:-pixsys-test-suite.pixsys.com}"
UPDATE_USER="${PXR_UPDATE_USER:-testkit-update}"
UPDATE_KEY="${PXR_UPDATE_KEY:-${SCRIPT_DIR}/auth/update_id_ed25519}"

if [ ! -r "$UPDATE_KEY" ]; then
    echo "Errore: chiave SSH non trovata: $UPDATE_KEY" >&2
    echo "       Assicurati di aver scompattato l'archivio mantenendo la struttura." >&2
    exit 1
fi

# OpenSSH rifiuta chiavi con permessi troppo aperti — l'unzip non li preserva
# necessariamente. Forziamo 0600.
chmod 600 "$UPDATE_KEY"

command -v scp       >/dev/null 2>&1 || { echo "Errore: scp non disponibile." >&2; exit 1; }
command -v sha256sum >/dev/null 2>&1 || { echo "Errore: sha256sum non disponibile." >&2; exit 1; }

# ── Workspace temporanea ────────────────────────────────────────────────────
TMP="$(mktemp -d -t test-kit-install.XXXXXX)"
trap 'rm -rf "$TMP"' EXIT

# ── known_hosts dedicato: non sporca /root/.ssh ─────────────────────────────
KNOWN_HOSTS="$TMP/known_hosts"
touch "$KNOWN_HOSTS"

SCP_OPTS=(
    -i "$UPDATE_KEY"
    -o BatchMode=yes
    -o StrictHostKeyChecking=accept-new
    -o ConnectTimeout=10
    -o UserKnownHostsFile="$KNOWN_HOSTS"
)

# ── 1. Manifest ─────────────────────────────────────────────────────────────
echo "==> Scarico latest.json da ${UPDATE_USER}@${UPDATE_SERVER}"
scp "${SCP_OPTS[@]}" "${UPDATE_USER}@${UPDATE_SERVER}:latest.json" "$TMP/"

json_get() {
    sed -n 's/.*"'"$1"'"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$2" | head -n1
}

VERSION="$(json_get version  "$TMP/latest.json")"
DATE="$(json_get    date     "$TMP/latest.json")"
FN="$(json_get      filename "$TMP/latest.json")"
SHA="$(json_get     sha256   "$TMP/latest.json")"

if [ -z "$VERSION" ] || [ -z "$DATE" ] || [ -z "$FN" ] || [ -z "$SHA" ]; then
    echo "Errore: manifest malformato" >&2
    cat "$TMP/latest.json" >&2
    exit 1
fi

case "$FN" in
    */*|''|.|..) echo "Errore: filename non valido: $FN" >&2; exit 1 ;;
esac
if ! printf '%s' "$SHA" | grep -qE '^[0-9a-fA-F]{64}$'; then
    echo "Errore: sha256 non valido nel manifest" >&2
    exit 1
fi

echo "==> Versione disponibile: v${VERSION} rev ${DATE} (${FN})"

# ── 2. Installer .run ───────────────────────────────────────────────────────
echo "==> Scarico ${FN}"
scp "${SCP_OPTS[@]}" "${UPDATE_USER}@${UPDATE_SERVER}:${FN}" "$TMP/"

# ── 3. Verifica sha256 ──────────────────────────────────────────────────────
ACTUAL="$(sha256sum "$TMP/$FN" | cut -d' ' -f1)"
if [ "$ACTUAL" != "$SHA" ]; then
    echo "Errore: sha256 mismatch" >&2
    echo "       atteso : $SHA"  >&2
    echo "       trovato: $ACTUAL" >&2
    exit 1
fi
echo "==> sha256 OK"

# ── 4. Esegui l'installer (il trap di rm -rf si perde con exec — accettabile,
#       /tmp/<dir> viene comunque ripulito al prossimo reboot) ───────────────
chmod +x "$TMP/$FN"
echo "==> Installazione in corso..."
exec "$TMP/$FN"
