#!/usr/bin/env bash
# Restore live DyzineFrame from ~/DyzineFrame-Rollback.
# Holds 03:00 promote while staging still has the broken from_version.
#
#   bash rollback_live.sh
#   RESTART=1 bash rollback_live.sh

if grep -q $'\r' "${BASH_SOURCE[0]}" 2>/dev/null; then
  sed -i 's/\r$//' "${BASH_SOURCE[0]}"
  exec bash "${BASH_SOURCE[0]}" "$@"
fi

set -euo pipefail

if [[ "$(id -un)" == root ]]; then
  echo "FATAL: do not run as root/sudo." >&2
  exit 1
fi

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=dyzineframe_paths.sh
source "${ROOT}/dyzineframe_paths.sh"
# shellcheck source=deploy_rsync.sh
source "${ROOT}/deploy_rsync.sh"
# shellcheck source=ota_lib.sh
source "${ROOT}/ota_lib.sh"

RESTART="${RESTART:-0}"

if [[ ! -d "${DYZINEFRAME_ROLLBACK}" ]]; then
  echo "FATAL: missing rollback dir ${DYZINEFRAME_ROLLBACK}" >&2
  exit 1
fi

if ! compgen -G "${DYZINEFRAME_ROLLBACK}/*" >/dev/null; then
  echo "FATAL: rollback dir is empty ${DYZINEFRAME_ROLLBACK}" >&2
  exit 1
fi

broken="$(ota_read_version "${DYZINEFRAME_ROOT}")"

echo "=== rollback_live ==="
echo "From: ${DYZINEFRAME_ROLLBACK}/"
echo "To:   ${DYZINEFRAME_ROOT}/"
echo ""

deploy_rsync_replace "${DYZINEFRAME_ROLLBACK}" "${DYZINEFRAME_ROOT}"
normalize_dyzineframe_shell_scripts "${DYZINEFRAME_ROOT}"

{
  echo "rolled_back_at=$(date -Is)"
  if [[ -f "${DYZINEFRAME_ROLLBACK}/.rollback-meta" ]]; then
    cat "${DYZINEFRAME_ROLLBACK}/.rollback-meta"
  fi
  echo "from_version=${broken}"
  echo "to_version=$(ota_read_version "${DYZINEFRAME_ROOT}")"
} > "${DYZINEFRAME_ROOT}/run/last-rollback.txt"

if [[ -n "${broken}" ]]; then
  ota_write_promote_hold "${DYZINEFRAME_ROOT}" "${broken}"
  echo "promote-hold set for from_version=${broken}"
fi

echo "rollback_live ok"
echo "Live version: $(ota_read_version "${DYZINEFRAME_ROOT}")"

if [[ "${RESTART}" == "1" ]]; then
  echo "Restarting DyzineFrame (numeric python PIDs only)..."
  ota_restart_dyzineframe "${DYZINEFRAME_ROOT}"
else
  echo "Restart from Pi desktop (or set RESTART=1)."
fi
