#!/usr/bin/env bash
# Manual, verified deployment promotion. Same code path for test and live operators.
set -Eeuo pipefail
umask 077
[[ "$EUID" -eq 0 ]] || { echo 'Requiere sudo/root' >&2; exit 2; }
VERSION="${1:-}"
[[ "$VERSION" =~ ^[0-9][0-9A-Za-z.+~-]{0,63}$ ]] || { echo 'Uso: sudo anurastream-activate VERSION' >&2; exit 2; }
TARGET="/opt/anurastream/releases/$VERSION"
CURRENT=/opt/anurastream/current
[[ -f "$TARGET/anurastream/__main__.py" ]] || { echo 'Versión no instalada' >&2; exit 2; }
command -v systemctl >/dev/null && command -v runuser >/dev/null || { echo 'Faltan systemctl o runuser' >&2; exit 2; }
CONFIG=/etc/anurastream/engine.json
[[ -f "$CONFIG" ]] || { echo 'No hay configuración inicial. Abortando' >&2; exit 2; }
OLD="$(readlink -f "$CURRENT" || true)"
if [[ "$OLD" == "$TARGET" ]]; then
  echo "AnuraStream $VERSION ya es la versión activa."
  exit 0
fi
# Never stop a working headend before checking its candidate code and configuration.
runuser -u anurastream -- env PYTHONPATH="$TARGET" python3 -m anurastream --config "$CONFIG" validate
runuser -u anurastream -- env PYTHONPATH="$TARGET" python3 -m anurastream check >/dev/null
mkdir -p -m 0700 /var/lib/anurastream/config-backups
BACKUP="/var/lib/anurastream/config-backups/engine.$(date -u +%Y%m%dT%H%M%SZ).json"
cp -a "$CONFIG" "$BACKUP"
chmod 0600 "$BACKUP"
[[ -z "$OLD" || -f "$OLD/anurastream/__main__.py" ]] || { echo 'Versión anterior no recuperable: abortando' >&2; exit 3; }
install_link() {
  local path="$1"
  ln -s "$path" "$CURRENT.next"
  mv -Tf "$CURRENT.next" "$CURRENT"
}
healthcheck() {
  local expected="$1" i
  for i in $(seq 1 12); do
    if systemctl is-active --quiet anurastream.service && python3 - "$expected" <<'PY'
import json,sys
from urllib.request import Request,urlopen
try:
 token=json.load(open('/etc/anurastream/engine.json'))['api_token']
 req=Request('http://127.0.0.1:8808/v1/health',headers={'Authorization':'Bearer '+token})
 with urlopen(req,timeout=2) as r:
  obj=json.load(r)
 sys.exit(0 if obj.get('service')=='anurastream-engine' and obj.get('version')==sys.argv[1] else 1)
except Exception:
 sys.exit(1)
PY
    then return 0; fi
    sleep 1
  done
  return 1
}
echo 'Se detendrán los canales durante el cambio de versión; mantenga una ventana de mantenimiento.'
systemctl stop anurastream.service
install_link "$TARGET"
systemctl daemon-reload
if systemctl start anurastream.service && healthcheck "$VERSION"; then
  echo "Actualización a AnuraStream $VERSION confirmada. Respaldo: $BACKUP"
  exit 0
fi
echo 'La nueva versión falló; iniciando reversión a la versión anterior...' >&2
systemctl stop anurastream.service || true
if [[ -n "$OLD" ]]; then
  install_link "$OLD"
  systemctl daemon-reload
  if systemctl start anurastream.service; then
    echo "Versión anterior restaurada: $OLD. Verifique calidad de canales." >&2
  else
    echo 'ERROR: tampoco arrancó la versión anterior. Requiere atención presencial.' >&2
  fi
else
  rm -f "$CURRENT"
  echo 'ERROR: no existía versión anterior para restaurar.' >&2
fi
exit 1
