#!/usr/bin/env bash
# Menyiapkan pasangan primary-standby untuk demo failover.
# Primary di port 54365, standby di port 54366 (database toko).
# Skrip promosi.sh dan divergensi.sh melanjutkan pasangan ini.
set -eu

PGBIN=/home/z/my-project/tools/dl/pgdeb/usr/lib/postgresql/17/bin
BASE=/home/z/my-project/tmp/rp_failover
PRI=$BASE/pgdata_pusat     # primary, port 54365
STD=$BASE/pgdata_cabang    # standby,  port 54366
SOCK=$BASE/sock

# Buang sisa percobaan sebelumnya bila ada.
"$PGBIN/pg_ctl" -D "$PRI" -m immediate stop >/dev/null 2>&1 || true
"$PGBIN/pg_ctl" -D "$STD" -m immediate stop >/dev/null 2>&1 || true
rm -rf "$BASE"
mkdir -p "$SOCK"

# Polling: tunggu sampai sebuah query mengembalikan nilai yang diharapkan.
tunggu() {  # port database sql nilai_yang_diharapkan
  local port="$1" db="$2" sql="$3" harapan="$4" i hasil
  for i in $(seq 1 150); do
    hasil=$(psql -X -q -t -A -h 127.0.0.1 -p "$port" -U postgres -d "$db" \
            -c "$sql" 2>/dev/null) || true
    if [ "$hasil" = "$harapan" ]; then return 0; fi
    sleep 0.2
  done
  echo "TIMEOUT: menunggu '$sql' menjadi $harapan (port $port)" >&2
  return 1
}

echo "== Langkah 1: initdb dan jalankan primary di port 54365 =="
"$PGBIN/initdb" -D "$PRI" --no-locale -E UTF8 -U postgres >/dev/null 2>&1
"$PGBIN/pg_ctl" -D "$PRI" \
  -o "-p 54365 -k $SOCK -c listen_addresses=127.0.0.1" \
  -l "$BASE/primary.log" start >/dev/null 2>&1
tunggu 54365 postgres "SELECT 1;" "1"
echo "primary siap"

echo "== Langkah 2: data awal di primary =="
psql -X -h 127.0.0.1 -p 54365 -U postgres -d postgres \
  -c "CREATE DATABASE toko;"
psql -X -h 127.0.0.1 -p 54365 -U postgres -d toko \
  -c "CREATE TABLE produk (id int PRIMARY KEY, nama text, harga numeric);" \
  -c "INSERT INTO produk VALUES (1, 'Kopi Tubruk', 15000), (2, 'Teh Celup', 8000);"

echo "== Langkah 3: pg_basebackup -R, lalu jalankan standby di port 54366 =="
PGDATABASE=postgres pg_basebackup -h 127.0.0.1 -p 54365 -U postgres \
  -D "$STD" -R -X stream -c fast >/dev/null 2>&1
"$PGBIN/pg_ctl" -D "$STD" \
  -o "-p 54366 -k $SOCK -c listen_addresses=127.0.0.1 -c cluster_name=standby_cabang" \
  -l "$BASE/standby.log" start >/dev/null 2>&1
tunggu 54366 toko "SELECT count(*) FROM produk;" "2"
echo "standby menyala dan konsisten"

echo "== Langkah 4: satu tulisan terakhir sebelum bencana =="
psql -X -h 127.0.0.1 -p 54365 -U postgres -d toko \
  -c "INSERT INTO produk VALUES (3, 'Gula Pasir', 12000);"
tunggu 54366 toko "SELECT count(*) FROM produk;" "3"
psql -X -h 127.0.0.1 -p 54366 -U postgres -d toko \
  -c "SELECT pg_is_in_recovery() AS sedang_recovery;"
