#!/usr/bin/env bash
set -Eeuo pipefail
umask 077
APP=/opt/nodo7-247
[[ -f $APP/scripts/common.sh ]] || { echo 'Instale NODO 7 primero.'; exit 1; }
# shellcheck source=scripts/common.sh
source "$APP/scripts/common.sh"
require_root; platform
exec 9>/run/lock/nodo7-247-update.lock
flock -n 9 || { echo 'Otra actualización está activa'; exit 1; }
current=$("$APP/bin/nodo7-247" version)
tmp=$(mktemp -d)
trap 'rm -rf -- "$tmp"' EXIT
curl -fSL --proto '=https' --tlsv1.2 "$BASE/latest.txt" -o "$tmp/latest.txt"
version=$(tr -d '\r\n' < "$tmp/latest.txt")
[[ $version =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || { echo 'Versión inválida'; exit 1; }
[[ $version != "$current" ]] || { echo "Ya está instalada v$current"; exit 0; }
echo "Actualizando $current → $version"
fetch_release "$version" "$tmp"
src="$tmp/unpacked/nodo7-247-creator"
[[ $(cat "$src/VERSION") == "$version" ]] || { echo 'Versión del paquete no coincide'; exit 1; }
stage=$(mktemp -d /opt/nodo7-247-next.XXXXXX)
install_tree "$src" "$stage"
"$stage/bin/ffmpeg" -version >/dev/null
[[ $("$stage/bin/nodo7-247" version) == "$version" ]] || exit 1
port=$(port_config)
backup=$(runuser -u nodo7 -- "$APP/bin/nodo7-247" backup)
rollback="/opt/nodo7-247-rollback-$(date +%s)"
stopped=0; swapped=0
recover() {
 local code=$?
 trap - ERR
 echo 'La actualización falló; restaurando versión anterior.' >&2
 if (( stopped )); then
  systemctl stop "$SERVICE" || true
  if (( swapped )); then mv "$APP" "$stage/failed"; mv "$rollback" "$APP"; fi
  "$APP/bin/nodo7-247" -archive "$backup" restore || echo 'ERROR: restauración de datos fallida; backup conservado.' >&2
  chown -R nodo7:nodo7 "$DATA"
  install -m 0644 "$APP/deploy/nodo7-247.service" /etc/systemd/system/nodo7-247.service
  systemctl daemon-reload; systemctl start "$SERVICE" || true
 fi
 exit "$code"
}
trap recover ERR
systemctl stop "$SERVICE"; stopped=1
# Snapshot again after stop to retain the final active-channel state.
backup=$(runuser -u nodo7 -- "$APP/bin/nodo7-247" backup)
mv "$APP" "$rollback"
if ! mv "$stage" "$APP"; then mv "$rollback" "$APP"; false; fi
swapped=1
mkdir -p "$stage"
install -m 0644 "$APP/deploy/nodo7-247.service" /etc/systemd/system/nodo7-247.service
systemctl daemon-reload
systemctl start "$SERVICE"
health "$port" "$version"
trap - ERR
echo "Actualización verificada. Backup: $backup. Binarios anteriores: $rollback"
