#!/usr/bin/env bash

set -euo pipefail

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly ROOT
readonly IMAGE="hugo-chiri-ops-02"
readonly NETWORK="hugo-chiri-ops-02-network"
readonly POSTGRES_CONTAINER="ops-02-postgres"
readonly REDIS_CONTAINER="ops-02-redis"
readonly POSTGRES_IMAGE="postgres:18.1-alpine@sha256:aa6eb304ddb6dd26df23d05db4e5cb05af8951cda3e0dc57731b771e0ef4ab29"
readonly REDIS_IMAGE="redis:8.2.3-alpine@sha256:08ad0b1d280850169a790dba1393ff7a90aef951fc19632cf4d3ce4f78e679ba"
readonly RESULTS="${ROOT}/results"

cleanup() {
  docker rm --force "${POSTGRES_CONTAINER}" "${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 "${POSTGRES_CONTAINER}" \
  --network "${NETWORK}" \
  --cpus=2 \
  --memory=512m \
  --env POSTGRES_DB=compatibility \
  --env POSTGRES_USER=fixture \
  --env POSTGRES_PASSWORD=fixture \
  "${POSTGRES_IMAGE}" >/dev/null
docker run --detach \
  --name "${REDIS_CONTAINER}" \
  --network "${NETWORK}" \
  --cpus=1 \
  --memory=256m \
  "${REDIS_IMAGE}" >/dev/null

for attempt in $(seq 1 60); do
  if docker exec "${POSTGRES_CONTAINER}" pg_isready \
      --dbname compatibility --username fixture >/dev/null 2>&1; then
    break
  fi
  if [[ ${attempt} -eq 60 ]]; then
    echo "PostgreSQL did not become ready" >&2
    exit 1
  fi
  sleep 0.25
done

for attempt in $(seq 1 60); do
  if docker exec "${REDIS_CONTAINER}" redis-cli ping | grep -qx PONG; then
    break
  fi
  if [[ ${attempt} -eq 60 ]]; then
    echo "Redis did not become ready" >&2
    exit 1
  fi
  sleep 0.25
done

docker run --rm \
  --network "${NETWORK}" \
  --cpus=2 \
  --memory=512m \
  --env DATABASE_URL=postgres://fixture:fixture@ops-02-postgres:5432/compatibility \
  --env REDIS_URL=redis://ops-02-redis:6379 \
  --volume "${RESULTS}:/experiment/results" \
  "${IMAGE}"
docker run --rm \
  --network "${NETWORK}" \
  --cpus=2 \
  --memory=512m \
  --env DATABASE_URL=postgres://fixture:fixture@ops-02-postgres:5432/compatibility \
  --env REDIS_URL=redis://ops-02-redis:6379 \
  --volume "${RESULTS}:/experiment/results" \
  --entrypoint node \
  "${IMAGE}" verify-profile.mjs
docker run --rm \
  --volume "${RESULTS}:/experiment/results" \
  --entrypoint sh \
  "${IMAGE}" -lc \
  'mkdir -p results/environment && npm audit --audit-level=low > results/environment/npm-audit.txt 2>&1'
docker run --rm \
  --volume "${RESULTS}:/experiment/results" \
  --entrypoint node \
  "${IMAGE}" decision-record.mjs
docker run --rm \
  --volume "${RESULTS}:/experiment/results" \
  --entrypoint sh \
  "${IMAGE}" -lc \
  'node source-evidence.mjs && node source-manifest.mjs && node mutate.mjs && node verify-results.mjs'
