#!/usr/bin/env bash

set -uo pipefail

if [ -z "${CARDANO_NODE_SOCKET_PATH:-}" ]; then
  echo "CARDANO_NODE_SOCKET_PATH is not set" >&2
  exit 1
fi

SOCKET_PATH="$(readlink -m "$CARDANO_NODE_SOCKET_PATH")"
STATE_CLUSTER="${SOCKET_PATH%/*}"
PID_FILE="${STATE_CLUSTER}/supervisord.pid"
SUPERVISORD_SOCKET_PATH="${STATE_CLUSTER}/supervisord.sock"

INSTANCE_NUM="%%INSTANCE_NUM%%"
if [[ "$SOCKET_PATH" != *"/state-cluster${INSTANCE_NUM}/"* ]]; then
  echo "CARDANO_NODE_SOCKET_PATH must be set to a path containing 'state-cluster${INSTANCE_NUM}', line $LINENO" >&2
  exit 1
fi

if [ -e "$SUPERVISORD_SOCKET_PATH" ]; then
  supervisorctl -s "unix:///${SUPERVISORD_SOCKET_PATH}" stop all || rm -f "$SUPERVISORD_SOCKET_PATH"
fi

if [ ! -f "$PID_FILE" ]; then
  echo "Cluster is not running!"
  exit 0
fi

kill_supervisor() {
  PID="$(<"$PID_FILE")" || return 1
  if ! kill -0 "$PID" 2>/dev/null; then
    return 0
  fi
  if ! kill "$PID"; then
    kill -0 "$PID" 2>/dev/null || return 0
    return 1
  fi
  for _ in {1..5}; do
    if ! kill -0 "$PID" 2>/dev/null; then
      return 0
    fi
    sleep 1
  done
  echo "Warning: process $PID did not exit after SIGTERM, sending SIGKILL." >&2
  kill -9 "$PID" 2>/dev/null || true
  kill -0 "$PID" 2>/dev/null && return 1
  return 0
}

if ! kill_supervisor; then
  echo "Failed to terminate cluster with PID $(<"$PID_FILE")" >&2
  exit 1
fi
rm -f "$PID_FILE"
echo "Cluster terminated!"
