#!/usr/bin/env bash

set -euo pipefail

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly ROOT
readonly IMAGE="hugo-chiri-lar-03"
readonly REDIS_IMAGE="redis:8.2.1-bookworm@sha256:5fa2edb1e408fa8235e6db8fab01d1afaaae96c9403ba67b70feceb8661e8621"
readonly RESULTS="${ROOT}/results"
readonly RUN_TOKEN="$$"
readonly NETWORK="hugo-chiri-lar-03-${RUN_TOKEN}"
readonly REDIS_CONTAINER="hugo-chiri-lar-03-redis-${RUN_TOKEN}"

cleanup() {
  docker stop "${REDIS_CONTAINER}" >/dev/null 2>&1 || true
  docker network rm "${NETWORK}" >/dev/null 2>&1 || true
}

trap cleanup EXIT

cd "${ROOT}"
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}/environment"
docker network create "${NETWORK}" >/dev/null
docker run --detach --rm \
  --name "${REDIS_CONTAINER}" \
  --network "${NETWORK}" \
  --network-alias redis \
  "${REDIS_IMAGE}" \
  redis-server --save '' --appendonly no >/dev/null

for attempt in {1..50}; do
  if docker exec "${REDIS_CONTAINER}" redis-cli ping 2>/dev/null \
    | grep -q PONG; then
    break
  fi
  sleep 0.1
done

docker exec "${REDIS_CONTAINER}" redis-cli ping | grep -q PONG
docker run --rm \
  --network "${NETWORK}" \
  --volume "${RESULTS}:/experiment/results" \
  "${IMAGE}"

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

docker run --rm \
  --network "${NETWORK}" \
  --volume "${RESULTS}:/experiment/results" \
  "${IMAGE}" node mutate.mjs

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

docker run --rm \
  --volume "${RESULTS}:/experiment/results" \
  "${IMAGE}" node source-evidence.mjs

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