#!/bin/sh
set -eu
umask 077

INIT="/etc/init.d/router-egress-emergency-decision"
HOOK="/usr/local/sbin/router-egress-emergency-decision-hook.sh"
RUNNER="/usr/local/sbin/router-egress-emergency-refresh.sh"
CONF="/etc/router-egress-emergency-refresh.conf"
HELPER="/usr/local/lib/router-egress-recovery-state.sh"
CRON="/etc/crontabs/root"

fact() {
  printf '__FACT__ %s=%s\n' "$1" "$2"
}

block() {
  echo "__BLOCK_BEGIN__ $1"
  printf '%s\n' "$2"
  echo "__BLOCK_END__ $1"
}

json_block() {
  echo "__JSON_BEGIN__ $1"
  printf '%s\n' "$2"
  echo "__JSON_END__ $1"
}

bool_cmd() {
  if "$@" >/dev/null 2>&1; then
    printf true
  else
    printf false
  fi
}

echo "__TRACE__ stage=required_files"

for path in \
  "$INIT" \
  "$HOOK" \
  "$RUNNER" \
  "$CONF" \
  "$HELPER" \
  "$CRON"
do
  [ -e "$path" ] || {
    echo "__ERROR__ missing=$path"
    exit 21
  }
done

echo "__TRACE__ stage=live_hashes"

fact init_sha256 "$(
  sha256sum "$INIT" |
    sed 's/[[:space:]].*$//'
)"

fact hook_sha256 "$(
  sha256sum "$HOOK" |
    sed 's/[[:space:]].*$//'
)"

fact runner_sha256 "$(
  sha256sum "$RUNNER" |
    sed 's/[[:space:]].*$//'
)"

echo "__TRACE__ stage=service_state"

fact service_running "$(bool_cmd "$INIT" running)"
fact service_enabled "$(bool_cmd "$INIT" enabled)"

if command -v ubus >/dev/null 2>&1; then
  UBUS_OUTPUT="$(
    ubus call service list \
      '{"name":"router-egress-emergency-decision"}' \
      2>&1 ||
    true
  )"

  block ubus_service "$UBUS_OUTPUT"
else
  block ubus_service "UBUS_MISSING"
fi

PS_OUTPUT="$(
  ps w 2>/dev/null |
    grep -E \
      'router-egress-emergency-decision|router-egress-emergency-refresh' |
    grep -v grep ||
  true
)"

block relevant_processes "$PS_OUTPUT"

echo "__TRACE__ stage=cron_state"

CRON_OUTPUT="$(
  grep -nE \
    'router-egress-emergency-decision|router-egress-emergency-refresh' \
    "$CRON" \
    2>/dev/null ||
  true
)"

block relevant_cron "$CRON_OUTPUT"

CRON_REFS="$(
  printf '%s\n' "$CRON_OUTPUT" |
    sed '/^$/d' |
    wc -l |
    tr -d ' '
)"

fact cron_reference_count "$CRON_REFS"

echo "__TRACE__ stage=current_state"

COMMIT="$(
  (
    unset EMERGENCY_COMMIT_ENABLED
    . "$CONF"

    case "${EMERGENCY_COMMIT_ENABLED:-0}" in
      1|true|TRUE|yes|YES|on|ON)
        printf true
        ;;
      *)
        printf false
        ;;
    esac
  )
)"

COUNTER="$(
  (
    unset REG_STATE_DIR
    . "$HELPER"
    reg_daily_repair_get
  )
)"

RUNNER_JSON="$("$RUNNER" --dry-run)"
HOOK_JSON="$("$HOOK")"

fact commit_enabled "$COMMIT"
fact repair_counter "$COUNTER"

json_block runner "$RUNNER_JSON"
json_block hook "$HOOK_JSON"

echo "__TRACE__ stage=safety"

fact production_modified false
fact vm101_modified false
fact commit_flag_changed false
fact watcher_invoked false
fact refresh_ran false
fact rebalance_apply_ran false
fact direct_failopen_changed false

echo "__TRACE__ stage=complete"
