#!/usr/bin/env bash
# Batasan logical replication yang paling sering menggigit:
# DDL dan sequence tidak ikut direplikasikan.
# Skrip terakhir chapter ini sekaligus menghentikan kedua server demo.
set -eu

PGBIN=/home/z/my-project/tools/dl/pgdeb/usr/lib/postgresql/17/bin
BASE=/home/z/my-project/tmp/rp_logical

# 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 "== Batasan 1: DDL tidak direplikasikan =="
psql -X -h 127.0.0.1 -p 54351 -U postgres -d pusat \
  -c "ALTER TABLE produk ADD COLUMN stok int DEFAULT 0;"
echo "jumlah kolom tabel produk:"
psql -X -h 127.0.0.1 -p 54351 -U postgres -d pusat \
  -c "SELECT count(*) AS kolom_pusat FROM information_schema.columns WHERE table_name = 'produk';"
psql -X -h 127.0.0.1 -p 54352 -U postgres -d cabang \
  -c "SELECT count(*) AS kolom_cabang FROM information_schema.columns WHERE table_name = 'produk';"

echo "== Skema yang berbeda membuat replikasi macet =="
psql -X -h 127.0.0.1 -p 54351 -U postgres -d pusat \
  -c "INSERT INTO produk (nama, harga, stok) VALUES ('Kopi Luwak', 250000, 3);"
echo "pantau 4 detik: baris ke-4 tidak pernah sampai cabang"
for i in $(seq 1 20); do
  n=$(psql -X -q -t -A -h 127.0.0.1 -p 54352 -U postgres -d cabang \
      -c "SELECT count(*) FROM produk;" 2>/dev/null)
  if [ "$n" -gt 3 ]; then
    echo "UNEXPECTED: baris sampai cabang, skrip tidak valid" >&2
    exit 1
  fi
  sleep 0.2
done
psql -X -h 127.0.0.1 -p 54352 -U postgres -d cabang \
  -c "SELECT count(*) AS baris_cabang FROM produk;"

echo "== Perbaikan: terapkan DDL yang sama manual di cabang =="
psql -X -h 127.0.0.1 -p 54352 -U postgres -d cabang \
  -c "ALTER TABLE produk ADD COLUMN stok int DEFAULT 0;"
tunggu 54352 cabang "SELECT count(*) FROM produk;" "4"
psql -X -h 127.0.0.1 -p 54352 -U postgres -d cabang \
  -c "SELECT id, nama, harga, stok FROM produk ORDER BY id;"

echo "== Batasan 2: sequence tidak direplikasikan =="
psql -X -h 127.0.0.1 -p 54351 -U postgres -d pusat \
  -c "SELECT nextval(pg_get_serial_sequence('produk', 'id')) AS id_berikut_pusat;"
psql -X -h 127.0.0.1 -p 54352 -U postgres -d cabang \
  -c "SELECT nextval(pg_get_serial_sequence('produk', 'id')) AS id_berikut_cabang;"

echo "== Bereskan demo =="
"$PGBIN/pg_ctl" -D "$BASE/pgdata_cabang" -m fast stop >/dev/null 2>&1
echo "subscriber berhenti"
"$PGBIN/pg_ctl" -D "$BASE/pgdata_pusat" -m fast stop >/dev/null 2>&1
echo "publisher berhenti"
rm -rf "$BASE"
echo "direktori data demo dihapus"
