#!/bin/sh
set -eu

repo_root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
command=${1:-}
if [ -z "$command" ]; then
  echo "usage: scripts/test-env doctor [--e2e] | coverage|status|logs|collect|recover|reuse|stop|reset|purge|gc [options]" >&2
  exit 2
fi
shift

if [ "$command" = --help ] || [ "$command" = -h ]; then
  echo "usage: scripts/test-env doctor [--e2e] | coverage|status|logs|collect|recover|reuse|stop|reset|purge|gc [options]"
  exit 0
fi

fail() { printf '%s\n' "test-env: $*" >&2; exit 2; }

doctor() {
  e2e=no
  while [ "$#" -gt 0 ]; do
    case $1 in
      --e2e) e2e=yes ;;
      --help|-h) echo "usage: scripts/test-env doctor [--e2e]"; return 0 ;;
      *) fail "unknown doctor option $1" ;;
    esac
    shift
  done
  docker version >/dev/null || fail "Docker is unavailable"
  docker compose version >/dev/null || fail "Docker Compose is unavailable"
  defaults=$repo_root/test/harness/defaults.toml
  [ -r "$defaults" ] || fail "harness defaults are unreadable"
  floor=$(awk -F '=' '/^free_space_floor_bytes[[:space:]]*=/{gsub(/[[:space:]]/, "", $2); print $2; exit}' "$defaults")
  case $floor in ''|*[!0-9]*) fail "harness free-space floor is invalid" ;; esac
  available_kib=$(df -Pk "$repo_root" | awk 'NR == 2 { print $4 }')
  case $available_kib in ''|*[!0-9]*) fail "could not determine available disk space" ;; esac
  available_bytes=$((available_kib * 1024))
  [ "$available_bytes" -ge "$floor" ] || fail "available disk space $available_bytes is below harness floor $floor"
  printf 'docker=ready compose=ready disk_available_bytes=%s disk_floor_bytes=%s cpus=%s\n' "$available_bytes" "$floor" "$(getconf _NPROCESSORS_ONLN 2>/dev/null || printf '?')"
  if [ "$e2e" = yes ]; then
    "$repo_root/scripts/windows/test-host" status
  fi
  cd "$repo_root"
  exec docker compose -f deploy/compose.yaml run --rm toolchain go run ./test/harness doctor
}

if [ "$command" = doctor ]; then
  doctor "$@"
  exit $?
fi

docker version >/dev/null
docker compose version >/dev/null

cd "$repo_root"
exec docker compose -f deploy/compose.yaml run --rm toolchain \
  go run ./test/harness "$command" "$@"
