#!/usr/bin/env bash
# Restore live EtherGold from ~/EtherGold-Rollback. Holds 03:00 promote of broken stamp.
#
#   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=ethergold_paths.sh
source "${ROOT}/ethergold_paths.sh"
# shellcheck source=ota_lib.sh
source "${ROOT}/ota_lib.sh"

RESTART="${RESTART:-0}"

if [[ ! -d "${ETHERGOLD_ROLLBACK}" ]]; then
  echo "FATAL: missing rollback dir ${ETHERGOLD_ROLLBACK}" >&2
  exit 1
fi

broken="$(ota_read_version "${ETHERGOLD_ROOT}")"
[[ -z "${broken}" ]] && broken="$(ota_read_version "${ETHERGOLD_PROD}")"

echo "=== EtherGold rollback_live ==="
if [[ -d "${ETHERGOLD_ROLLBACK}/prod" ]]; then
  rsync -a --exclude logs/ --exclude run/ --exclude rclone.env \
    "${ETHERGOLD_ROLLBACK}/prod/" "${ETHERGOLD_PROD}/"
fi
if [[ -d "${ETHERGOLD_ROLLBACK}/sync" ]]; then
  rsync -a --exclude rclone.env \
    "${ETHERGOLD_ROLLBACK}/sync/" "${ETHERGOLD_SYNC}/"
fi
if [[ -f "${ETHERGOLD_ROLLBACK}/VERSION.txt" ]]; then
  cp -a "${ETHERGOLD_ROLLBACK}/VERSION.txt" "${ETHERGOLD_ROOT}/VERSION.txt"
fi
# Field runtime is prod; copy rollback prod VERSION if present.
if [[ -f "${ETHERGOLD_ROLLBACK}/prod/VERSION.txt" ]]; then
  cp -a "${ETHERGOLD_ROLLBACK}/prod/VERSION.txt" "${ETHERGOLD_PROD}/VERSION.txt"
fi

mkdir -p "${ETHERGOLD_ROOT}/run"
{
  echo "rolled_back_at=$(date -Is)"
  [[ -f "${ETHERGOLD_ROLLBACK}/.rollback-meta" ]] && cat "${ETHERGOLD_ROLLBACK}/.rollback-meta"
  echo "from_version=${broken}"
  echo "to_version=$(ota_read_version "${ETHERGOLD_ROOT}")"
} > "${ETHERGOLD_ROOT}/run/last-rollback.txt"

if [[ -n "${broken}" ]]; then
  ota_write_promote_hold "${ETHERGOLD_ROOT}" "${broken}"
fi

echo "rollback_live ok  live=$(ota_read_version "${ETHERGOLD_ROOT}")"

# Keep KillMode=process even if rollback restores older listen scripts.
ota_apply_uartd_persist_dropin "${ETHERGOLD_SYNC}/install_uartd_persist_dropin.sh"
ota_install_hs_out_idle "${ETHERGOLD_SYNC}/install_hs_out_idle.sh"
ota_install_eg_deploy_schedule "${ETHERGOLD_SYNC}/install_pi_deploy_schedule.sh"

ota_restart_ethergold_http

if [[ "${RESTART}" == "1" ]]; then
  ota_restart_ethergold_listen
fi
