#!/usr/bin/env bash
# 지정한 노드의 reported state 와 assigned(goal) state 가 모두 지정한 값이 될 때까지 기다리고 걸린 시간을 출력한다.
# 사용: ./scripts/wait-state.sh <node> <state> [timeout초]
#   예: ./scripts/wait-state.sh node2 primary 120
set -euo pipefail
cd "$(dirname "$0")/.."
DC="docker compose"; $DC version >/dev/null 2>&1 || DC=docker-compose
node="$1"; want="$2"; limit="${3:-120}"
start=$(python3 -c 'import time;print(time.time())')
q="select reportedstate || '/' || goalstate from pgautofailover.node where nodename = '${node}'"
while :; do
  cur=$($DC exec -T monitor psql -d pg_auto_failover -Atc "$q" 2>/dev/null || true)
  now=$(python3 -c 'import time;print(time.time())')
  el=$(python3 -c "print('%.1f' % ($now-$start))")
  if [ "$cur" = "$want/$want" ]; then echo "$node reached $want in ${el}s"; exit 0; fi
  if python3 -c "import sys; sys.exit(0 if $now-$start > $limit else 1)"; then
    echo "timeout: $node is '${cur}' after ${el}s"; exit 1
  fi
  sleep 0.2
done
