#!/usr/bin/env bash
# Real demos for P080 "How a NoSQL Database Like MongoDB Works". Runs on render01 (Docker).
# A three-server MongoDB replica set and a laptop, all from the official mongo:8 image, on one internal
# Docker network (no internet), deleted at the end:
#   mongo1, mongo2, mongo3   mongod --replSet rs0 (one replica set, "rs0")
#   laptop                   only runs mongosh, connected to the replica set (mongodb://mongo1,mongo2,mongo3/?replicaSet=rs0)
# The bookshop's 200,000 made-up catalogue entries for the index demo are loaded off-screen (lab/catalog.js).
# demo_driver.py runs every command and saves it with its real output to demo_output.json.
set -euo pipefail
cd "$(dirname "$0")"
NET=bookshop
cleanup() { docker rm -f mongo1 mongo2 mongo3 laptop >/dev/null 2>&1 || true; docker network rm $NET >/dev/null 2>&1 || true; }
cleanup
[ -n "${KEEP:-}" ] || trap cleanup EXIT
docker network create --internal $NET >/dev/null
for n in mongo1 mongo2 mongo3; do
  docker run -d --name $n --hostname $n --network $NET mongo:8 mongod --replSet rs0 --bind_ip_all >/dev/null
done
docker run -d --name laptop --hostname laptop --network $NET --entrypoint sleep mongo:8 infinity >/dev/null
for n in mongo1 mongo2 mongo3; do
  for i in $(seq 60); do docker exec $n mongosh --quiet --eval 'db.runCommand({ping: 1}).ok' >/dev/null 2>&1 && break; sleep 1; done
done
docker exec mongo1 mongosh --quiet --eval 'rs.initiate({_id: "rs0", members: [
  {_id: 0, host: "mongo1:27017"}, {_id: 1, host: "mongo2:27017"}, {_id: 2, host: "mongo3:27017"}]})' >/dev/null
for i in $(seq 60); do
  [ "$(docker exec mongo1 mongosh --quiet --eval 'db.hello().isWritablePrimary' 2>/dev/null)" = "true" ] && break; sleep 1
done
python3 demo_driver.py
