#!/usr/bin/env bash
set -euo pipefail

if [[ $# -ne 2 ]]; then
  echo "usage: $0 OUTPUT_DIR RUN_ID" >&2
  exit 2
fi

output_dir=$(realpath -m "$1")
run_id=$2
[[ "$run_id" =~ ^[a-zA-Z0-9_-]+$ ]] || { echo "bad RUN_ID" >&2; exit 2; }
script_dir=$(cd -- "$(dirname -- "$0")" && pwd)
server="h58-mariadb-official-$run_id"
mkdir -p "$output_dir"

capture() {
  if docker inspect "$server" >/dev/null 2>&1; then
    docker inspect "$server" --format \
      'status={{.State.Status}} exit_code={{.State.ExitCode}} oom_killed={{.State.OOMKilled}}' \
      >"$output_dir/container-state.txt" || true
    docker logs "$server" >"$output_dir/server.stdout" \
      2>"$output_dir/server.stderr" || true
  fi
}
cleanup() {
  capture
  if [[ "$(docker inspect "$server" --format '{{.State.Running}}' 2>/dev/null || true)" == true ]]; then
    docker stop --time 5 "$server" >/dev/null 2>&1 || true
  fi
  docker rm -f "$server" >/dev/null 2>&1 || true
}
trap cleanup EXIT

docker run -d --name "$server" --cpus=1 --memory=2g --pids-limit=256 \
  -e MARIADB_ROOT_PASSWORD=h58root mariadb:11.8.8 \
  --performance-schema=OFF --skip-name-resolve >/dev/null

ready=0
consecutive=0
for _ in $(seq 1 160); do
  if docker exec "$server" mariadb --no-defaults -uroot --password=h58root \
      -e 'SELECT 1' >/dev/null 2>&1; then
    consecutive=$((consecutive + 1))
    if [[ "$consecutive" -ge 8 ]]; then ready=1; break; fi
  else
    consecutive=0
  fi
  [[ "$(docker inspect "$server" --format '{{.State.Running}}' 2>/dev/null || true)" == true ]] || break
  sleep 0.25
done
[[ "$ready" == 1 ]] || exit 70

set +e
timeout 60 docker exec -i "$server" mariadb --no-defaults -uroot \
  --password=h58root --batch --show-warnings --force \
  <"$script_dir/reproduce.sql" >"$output_dir/query.stdout" \
  2>"$output_dir/query.stderr"
query_rc=$?
set -e

running=$(docker inspect "$server" --format '{{.State.Running}}')
oom=$(docker inspect "$server" --format '{{.State.OOMKilled}}')
{
  printf 'query_rc\t%s\n' "$query_rc"
  printf 'server_running_after\t%s\n' "$running"
  printf 'oom_killed\t%s\n' "$oom"
} >"$output_dir/status.tsv"
capture
