#!/usr/bin/env bash
set -euo pipefail

# Controlled staging-only E2E-11/E2E-12 operations. This script never deletes
# outbox/inbox/checkpoint data and never sources an application dotenv file.

APP_DIR=${TT_PHASE1_APP_DIR:?TT_PHASE1_APP_DIR is required}
ACTION=${TT_PHASE1_E2E_ACTION:?TT_PHASE1_E2E_ACTION is required}
RUN_ID=${TT_PHASE1_E2E_RUN_ID:?TT_PHASE1_E2E_RUN_ID is required}
EXPECTED_SHA=${TT_PHASE1_E2E_EXPECTED_SHA:?TT_PHASE1_E2E_EXPECTED_SHA is required}
PUBLISHER_NAME=${TT_PHASE1_PUBLISHER_NAME:-timetabler-rb-phase1-publisher}
PYTHON_BIN=${TT_PHASE1_PYTHON_BIN:-"$APP_DIR/venv/bin/python"}

[[ "$RUN_ID" =~ ^phase1-e2e-[a-z0-9][a-z0-9-]{5,80}$ ]]
[[ "$ACTION" == "restart" || "$ACTION" == "rollback" ]]
[[ "${TT_PHASE1_E2E_CONFIRM_MUTATION:-False}" == "True" ]]
[[ "${TT_PHASE1_E2E_CONFIRM_OPERATIONAL:-False}" == "True" ]]
[[ "${RB_INTEGRATION_REVERSE_DELIVERY_ENABLED:-False}" == "False" ]]
[[ "${RB_INTEGRATION_PHASE:-phase1}" == "phase1" ]]
[[ -x "$PYTHON_BIN" ]]
[[ "$(git -C "$APP_DIR" rev-parse HEAD)" == "$EXPECTED_SHA" ]]

# shellcheck source=deploy/resolve_phase1_pm2.sh
source "$APP_DIR/deploy/resolve_phase1_pm2.sh"
phase1_resolve_pm2
PM2_BIN=$PHASE1_PM2_BIN

count_process() {
  PM2_SILENT=true "$PM2_BIN" jlist --silent | \
    "$PYTHON_BIN" "$APP_DIR/deploy/parse_pm2_jlist.py" count --name "$1"
}

[[ "$(count_process "$PUBLISHER_NAME")" == "1" ]]

fail_closed() {
  status=$?
  trap - EXIT
  if [[ "$status" -ne 0 ]]; then
    "$PM2_BIN" stop "$PUBLISHER_NAME" >/dev/null 2>&1 || true
    echo '{"operation":"failed_closed","publisher_running":false}' >&2
  fi
  exit "$status"
}
trap fail_closed EXIT

cd "$APP_DIR"
"$PYTHON_BIN" manage.py preflight_resource_booking_phase1 --require-enabled >/dev/null

if [[ "$ACTION" == "restart" ]]; then
  # Timetabler owns only its publisher restart. The RB workflow owns its consumer.
  "$PM2_BIN" restart "$PUBLISHER_NAME" >/dev/null
else
  # Exercise a configuration rollback while preserving every durable record.
  "$PM2_BIN" stop "$PUBLISHER_NAME" >/dev/null
  "$PYTHON_BIN" "$APP_DIR/deploy/configure_phase1_publisher.py" \
    --env-file "${TT_PHASE1_ENV_FILE:-$APP_DIR/.env}" --disable-only >/dev/null
  RB_INTEGRATION_PUBLISH_ENABLED=True \
    RB_INTEGRATION_ACTIVATION_APPROVED=True \
    RB_INTEGRATION_REVERSE_DELIVERY_ENABLED=False \
    bash "$APP_DIR/deploy/phase1-publisher-deployment-gate.sh" >/dev/null
fi

"$PYTHON_BIN" manage.py probe_resource_booking_publisher --liveness >/dev/null
[[ "$(count_process "$PUBLISHER_NAME")" == "1" ]]
"$PM2_BIN" save --force >/dev/null
trap - EXIT
printf '{"operation":"%s","run_id":"%s","publisher_count":1,"durable_state_deleted":false,"reverse_delivery_enabled":false,"resource_booking_process_touched":false}\n' \
  "$ACTION" "$RUN_ID"
