#!/usr/bin/env bash
# Menyiapkan pasangan primary-standby untuk demo streaming replication.
# Dua server mini ini terpisah dari server utama course (socket 54329):
# primary demo berjalan di port 54341, standby di port 54342.
# Skrip berikutnya (aliran-data.sh) memakai pasangan yang ditinggalkan skrip ini.
set -eu

PGBIN=/home/z/my-project/tools/dl/pgdeb/usr/lib/postgresql/17/bin
BASE=/home/z/my-project/tmp/rp_stream
PRI=$BASE/pgdata_pusat     # primary, port 54341
STD=$BASE/pgdata_cabang    # standby,  port 54342
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 80); 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 cluster primary baru =="
"$PGBIN/initdb" -D "$PRI" --no-locale -E UTF8 -U postgres >/dev/null
echo "cluster primary siap"

echo "== Langkah 2: jalankan primary di port 54341 =="
"$PGBIN/pg_ctl" -D "$PRI" \
  -o "-p 54341 -k $SOCK -c listen_addresses=127.0.0.1 -c wal_level=replica -c max_wal_senders=10" \
  -l "$BASE/primary.log" start >/dev/null 2>&1
tunggu 54341 postgres "SELECT 1;" "1"
echo "primary menerima koneksi"

echo "== Langkah 3: buat database dan data awal di primary =="
psql -X -h 127.0.0.1 -p 54341 -U postgres -d postgres \
  -c "CREATE DATABASE toko;"
psql -X -h 127.0.0.1 -p 54341 -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 4: pg_basebackup -R menyalin primary menjadi standby =="
PGDATABASE=postgres pg_basebackup -h 127.0.0.1 -p 54341 -U postgres \
  -D "$STD" -R -X stream -c fast >/dev/null 2>&1
echo "base backup selesai"

echo "== Langkah 5: file yang ditulis otomatis oleh -R =="
cat "$STD/postgresql.auto.conf"
[ -f "$STD/standby.signal" ] && echo "standby.signal ada"

echo "== Langkah 6: jalankan standby di port 54342 =="
"$PGBIN/pg_ctl" -D "$STD" \
  -o "-p 54342 -k $SOCK -c listen_addresses=127.0.0.1 -c cluster_name=standby_cabang" \
  -l "$BASE/standby.log" start >/dev/null 2>&1
tunggu 54342 toko "SELECT count(*) FROM produk;" "2"
echo "standby menyala dan sudah konsisten"

echo "== Langkah 7: data awal terbaca dari standby =="
psql -X -h 127.0.0.1 -p 54342 -U postgres -d toko \
  -c "SELECT id, nama, harga FROM produk ORDER BY id;"
