#!/usr/bin/env bash
# Real demos for P071 "How to Fix MySQL Too Many Connections Database Errors". Runs on render01 (Docker).
# A small lab on its own internal Docker network (172.30.71.0/24, no way out), deleted at the end:
#   db       MySQL 8.4 LTS (official mysql:8.4 image), database "tickets", app account "shop"
#   shop-1   Ana's ticket shop (lab/Dockerfile: python:3.13-slim + PyMySQL + SQLAlchemy, code in lab/shop)
#   shop-2   a second copy of the shop, shop-3 a third (for the pool-size story)
# Every command shown is typed into a real interactive shell in a pty (demo_driver.py). The root password lives
# in root's MySQL option file (/root/.my.cnf) inside db, written off-screen, so it never appears.
set -euo pipefail
cd "$(dirname "$0")"
P=ce-p071
cleanup() { docker rm -f $P-db $P-shop-1 $P-shop-2 $P-shop-3 >/dev/null 2>&1 || true
            docker network rm $P >/dev/null 2>&1 || true; }
cleanup
[ -n "${KEEP:-}" ] || trap cleanup EXIT
docker build -q -t $P-app lab >/dev/null
docker network create --internal --subnet 172.30.71.0/24 $P >/dev/null
ROOT_PW="$(head -c 18 /dev/urandom | base64 | tr -d '/+=')"
SHOP_PW="$(head -c 18 /dev/urandom | base64 | tr -d '/+=')"
docker run -d --name $P-db --hostname db --network $P --ip 172.30.71.2 \
  -e MYSQL_ROOT_PASSWORD="$ROOT_PW" -e MYSQL_DATABASE=tickets -e MYSQL_USER=shop -e MYSQL_PASSWORD="$SHOP_PW" \
  mysql:8.4 >/dev/null
for n in 1 2 3; do
  docker run -d --name $P-shop-$n --hostname shop-$n --network $P --ip 172.30.71.1$n \
    --add-host db:172.30.71.2 -e DB_PASSWORD="$SHOP_PW" $P-app >/dev/null
done
printf '[client]\nuser=root\npassword=%s\n[mysql]\nprompt=__READY__:mysql:__\\_\n' "$ROOT_PW" \
  | docker exec -i $P-db sh -c 'cat > /root/.my.cnf && chmod 600 /root/.my.cnf'
for i in $(seq 90); do docker exec $P-db mysql -e 'SELECT 1' >/dev/null 2>&1 && break; sleep 2; done
sleep 3
docker exec -i $P-db mysql tickets < lab/schema.sql
python3 - "$P" < demo_driver.py
