#!/usr/bin/env bash
# Drill restore fisik: base backup dinyalakan sebagai instance terpisah.
set -euo pipefail

DB_LATIHAN=probe_drill_bk7
TUJUAN=/tmp/pgtutor-drill/fisik
PORT_BARU=54330
# pg_ctl hanya ada di direktori biner server (bukan paket klien) di lab ini.
PGBIN=/home/z/my-project/tools/dl/pgdeb/usr/lib/postgresql/17/bin
PENGECEKAN="SELECT md5(string_agg(id::text || ':' || item || ':' || jumlah::text, ',' ORDER BY id)) FROM penjualan;"

bersihkan() {
    "$PGBIN/pg_ctl" -D "$TUJUAN" stop >/dev/null 2>&1 || true
    psql -X -q -d postgres -c "DROP DATABASE IF EXISTS $DB_LATIHAN;" >/dev/null 2>&1 || true
    rm -rf /tmp/pgtutor-drill
}
trap bersihkan EXIT

rm -rf /tmp/pgtutor-drill
mkdir -p /tmp/pgtutor-drill

# Port drill harus benar-benar bebas.
if pg_isready -q -h /tmp -p "$PORT_BARU"; then
    echo "port $PORT_BARU sedang dipakai, drill dibatalkan" >&2
    exit 1
fi

# 1. Siapkan "database korban" di server utama.
psql -X -q -d postgres -c "DROP DATABASE IF EXISTS $DB_LATIHAN;" \
    -c "CREATE DATABASE $DB_LATIHAN;"
psql -X -q -d "$DB_LATIHAN" \
    -c "CREATE TABLE penjualan (id int PRIMARY KEY, item text, jumlah int);" \
    -c "INSERT INTO penjualan VALUES (1,'Kopi Torabika',12),(2,'Teh Melati',8),(3,'Gula Pasir',25);"

SEBELUM=$(psql -X -t -A -d "$DB_LATIHAN" -c "$PENGECEKAN")
echo "checksum di server utama      : $SEBELUM"

# 2. Base backup mandiri (-Xs): seluruh cluster termasuk database korban.
pg_basebackup -D "$TUJUAN" -Fp -Xs --checkpoint=fast --no-password

# 3. Nyalakan salinan sebagai instance baru di port 54330.
#    Keluaran pg_ctl penuh titik-titik tunggu, dibuang supaya deterministik.
"$PGBIN/pg_ctl" -D "$TUJUAN" -l /tmp/pgtutor-drill/fisik.log \
    -o "-p $PORT_BARU -k /tmp -c listen_addresses=''" start >/dev/null 2>&1

for _ in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
    if pg_isready -q -h /tmp -p "$PORT_BARU"; then break; fi
    sleep 1
done
pg_isready -h /tmp -p "$PORT_BARU"

# 4. Verifikasi data: koneksi ke instance baru, database yang sama.
SESUDAH=$(psql -X -t -A -h /tmp -p "$PORT_BARU" -d "$DB_LATIHAN" -c "$PENGECEKAN")
echo "checksum di instance restore  : $SESUDAH"

# 5. Verifikasi status: replay WAL selesai, server jadi primary baru.
psql -X -t -A -h /tmp -p "$PORT_BARU" -d postgres -c "SELECT pg_is_in_recovery();"
psql -X -t -A -h /tmp -p "$PORT_BARU" -d postgres -c "SELECT timeline_id FROM pg_control_checkpoint();"

if [ "$SEBELUM" = "$SESUDAH" ]; then
    echo "HASIL DRILL: DATA IDENTIK"
else
    echo "HASIL DRILL: DATA BERBEDA" >&2
    exit 1
fi

# 6. Matikan instance drill; trap bersihkan() menuntaskan sisanya.
"$PGBIN/pg_ctl" -D "$TUJUAN" stop >/dev/null 2>&1
