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

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

output_dir=$(realpath -m "$1")
mode=$2
run_id=$3
if [[ ! "$run_id" =~ ^[a-zA-Z0-9_-]+$ ]]; then
  echo "RUN_ID contains unsupported characters" >&2
  exit 2
fi
case "$mode" in
  control) width=1 ;;
  trigger) width=65520 ;;
  *) echo "invalid mode: $mode" >&2; exit 2 ;;
esac

script_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
server="h44-mariadb-release-$run_id"
image="mariadb:11.8.8"
mkdir -p "$output_dir"
python3 "$script_dir/generate_case.py" --count 65550 --width "$width" \
  >"$output_dir/case.sql"

capture() {
  if docker inspect "$server" >/dev/null 2>&1; then
    docker inspect "$server" >"$output_dir/container.inspect.json" || true
    docker inspect "$server" --format \
      'status={{.State.Status}} exit_code={{.State.ExitCode}} oom_killed={{.State.OOMKilled}} started_at={{.State.StartedAt}} finished_at={{.State.FinishedAt}} image={{.Image}}' \
      >"$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 10 "$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=4g --pids-limit=512 \
  -e MARIADB_ROOT_PASSWORD=h44root "$image" --performance-schema=OFF \
  --skip-name-resolve >/dev/null

ready=0
consecutive=0
for _ in $(seq 1 240); do
  if docker exec "$server" mariadb --no-defaults -u root \
       --password=h44root --batch -e "SELECT 1" >/dev/null 2>&1; then
    consecutive=$((consecutive + 1))
    if [[ "$consecutive" -ge 8 ]]; then
      ready=1
      break
    fi
  else
    consecutive=0
  fi
  if [[ "$(docker inspect "$server" --format '{{.State.Running}}')" != true ]]; then
    break
  fi
  sleep 0.25
done
if [[ "$ready" != 1 ]]; then
  printf 'server_ready\t0\n' >"$output_dir/status.tsv"
  exit 70
fi

docker exec "$server" mariadb --no-defaults -u root --password=h44root --batch \
  -e "DROP DATABASE IF EXISTS h44;
      DROP USER IF EXISTS 'h44u'@'localhost';
      CREATE DATABASE h44;
      CREATE USER 'h44u'@'localhost' IDENTIFIED BY 'h44pass';
      GRANT SELECT, INSERT, CREATE, DROP ON h44.* TO 'h44u'@'localhost';" \
  >"$output_dir/setup.stdout" 2>"$output_dir/setup.stderr"

set +e
timeout --signal=TERM 240 docker exec -i "$server" mariadb --no-defaults \
  -u h44u --password=h44pass --batch --show-warnings \
  <"$output_dir/case.sql" >"$output_dir/query.stdout" \
  2>"$output_dir/query.stderr"
query_rc=$?
set -e

for _ in $(seq 1 40); do
  [[ "$(docker inspect "$server" --format '{{.State.Running}}' 2>/dev/null || true)" != true ]] && break
  sleep 0.25
done

running=$(docker inspect "$server" --format '{{.State.Running}}' 2>/dev/null || echo false)
oom=$(docker inspect "$server" --format '{{.State.OOMKilled}}' 2>/dev/null || echo unknown)
exit_code=$(docker inspect "$server" --format '{{.State.ExitCode}}' 2>/dev/null || echo unknown)
capture
{
  printf 'server_ready\t1\n'
  printf 'mode\t%s\n' "$mode"
  printf 'argument_count\t65550\n'
  printf 'source_width\t%s\n' "$width"
  printf 'query_rc\t%s\n' "$query_rc"
  printf 'server_running_after\t%s\n' "$running"
  printf 'oom_killed\t%s\n' "$oom"
  printf 'container_exit_code\t%s\n' "$exit_code"
} >"$output_dir/status.tsv"
