#!/usr/bin/env bash

set -euo pipefail

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly ROOT
readonly IMAGE="hugo-chiri-lar-06"
readonly NETWORK="hugo-chiri-lar-06-network"
readonly REDIS_CONTAINER="hugo-chiri-lar-06-redis"
readonly REDIS_IMAGE="redis:8.2.3-alpine@sha256:08ad0b1d280850169a790dba1393ff7a90aef951fc19632cf4d3ce4f78e679ba"
readonly REDIS_READONLY_PASSWORD="lar06-${RANDOM}-${RANDOM}"
readonly RESULTS="${ROOT}/results"

cleanup() {
  docker rm --force "${REDIS_CONTAINER}" >/dev/null 2>&1 || true
  docker network rm "${NETWORK}" >/dev/null 2>&1 || true
}
trap cleanup EXIT INT TERM

cd "${ROOT}"
cleanup
docker build --tag "${IMAGE}" .

if [[ "${RESULTS}" != "${ROOT}/results" ]]; then
  echo "refusing to clear an unexpected results directory" >&2
  exit 65
fi
rm -rf "${RESULTS}"
mkdir -p "${RESULTS}"

docker network create "${NETWORK}" >/dev/null
docker run --detach \
  --name "${REDIS_CONTAINER}" \
  --network "${NETWORK}" \
  --memory=256m \
  "${REDIS_IMAGE}" \
  redis-server --save '' --appendonly no >/dev/null

attempt=0
until docker exec "${REDIS_CONTAINER}" redis-cli ping | grep -q PONG; do
  attempt=$((attempt + 1))
  if [[ "${attempt}" -ge 50 ]]; then
    docker logs "${REDIS_CONTAINER}"
    exit 1
  fi
  sleep 0.1
done

docker exec "${REDIS_CONTAINER}" redis-cli ACL SETUSER lar06readonly \
  on ">${REDIS_READONLY_PASSWORD}" '~lar06:*' '+auth' '+client' '+get' '+mget' \
  '+exists' '+ping' '+select' >/dev/null

docker run --rm \
  --network "${NETWORK}" \
  --cpus=2 \
  --memory=1g \
  --env REDIS_HOST="${REDIS_CONTAINER}" \
  --volume "${RESULTS}:/experiment/results" \
  "${IMAGE}"

docker run --rm \
  --network "${NETWORK}" \
  --cpus=2 \
  --memory=1g \
  --env REDIS_HOST="${REDIS_CONTAINER}" \
  --volume "${RESULTS}:/experiment/results" \
  --entrypoint sh \
  "${IMAGE}" -lc 'php bin/profile.php && php bin/verify-profile.php'

docker run --rm \
  --network "${NETWORK}" \
  --cpus=2 \
  --memory=1g \
  --env REDIS_HOST="${REDIS_CONTAINER}" \
  --volume "${RESULTS}:/experiment/results" \
  --entrypoint sh \
  "${IMAGE}" -lc 'node concurrency.mjs && node verify-concurrency.mjs'

docker run --rm \
  --network "${NETWORK}" \
  --cpus=2 \
  --memory=1g \
  --env REDIS_HOST="${REDIS_CONTAINER}" \
  --volume "${RESULTS}:/experiment/results" \
  --entrypoint sh \
  "${IMAGE}" -lc \
  'php bin/flexible-profile.php && node flexible.mjs && node verify-flexible.mjs'

docker run --rm \
  --network "${NETWORK}" \
  --cpus=2 \
  --memory=1g \
  --env REDIS_HOST="${REDIS_CONTAINER}" \
  --env REDIS_READONLY_PASSWORD="${REDIS_READONLY_PASSWORD}" \
  --volume "${RESULTS}:/experiment/results" \
  --entrypoint php \
  "${IMAGE}" bin/failure-profile.php

docker run --rm \
  --network "${NETWORK}" \
  --cpus=2 \
  --memory=1g \
  --env REDIS_HOST="${REDIS_CONTAINER}" \
  --env REDIS_PORT=6390 \
  --volume "${RESULTS}:/experiment/results" \
  --entrypoint php \
  "${IMAGE}" bin/cache-unavailable.php

docker run --rm \
  --volume "${RESULTS}:/experiment/results" \
  --entrypoint node \
  "${IMAGE}" verify-failures.mjs

docker run --rm \
  --volume "${RESULTS}:/experiment/results" \
  --entrypoint sh \
  "${IMAGE}" -lc \
  'mkdir -p results/environment && composer audit --locked --no-interaction > results/environment/composer-audit.txt 2>&1'

docker run --rm \
  --volume "${RESULTS}:/experiment/results" \
  --entrypoint sh \
  "${IMAGE}" -lc \
  'node source-evidence.mjs && node decision-record.mjs && node source-manifest.mjs && node mutate.mjs && node verify-results.mjs'
