#!/usr/bin/env bash
set -euo pipefail
show_help() {
  cat <<'HELP'
Usage: bin/check

Build and run unit/race/static, smoke, migration, operational and contract checks.
Requires Go 1.26+, PostgreSQL, Python 3.14, uv, and curl.

RESETS data in assignment_harness_native and assignment_harness_django.
Uses ports 18000 and 18001; stop development servers first.
PGHOST, PGPORT, PGUSER and PGPASSWORD configure PostgreSQL connections.
DATABASE_URL does not override the suite's fixed database names.
Installs locked Python dependencies and writes diagnostics under .artifacts/.
TMPDIR defaults to ~/codex-tmp.

Example:
  bin/check

Options:
  -h, --help    Show this help without performing work.
HELP
}
case "${1:-}" in
  -h|--help|help) show_help; exit 0 ;;
  "") ;;
  *) printf 'Unexpected argument; use bin/check --help\n' >&2; exit 2 ;;
esac
project_root=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
cd "$project_root"
export TMPDIR="${TMPDIR:-$HOME/codex-tmp}"
mkdir -p "$TMPDIR" .artifacts
bin/build
(cd harness && go test -race ./... && go vet ./...)
(cd go-service && go test -race ./... && go vet ./...)
bin/reference setup
bin/reference test
harness/harness init-db --db 'dbname=assignment_harness_native'
DATABASE_URL='dbname=assignment_harness_native' go-service/contentd migrate
harness/harness claim --db 'dbname=assignment_harness_native'
harness/harness fixture --db 'dbname=assignment_harness_native'
# A second migration must be safe and leave the initialized schema unchanged.
DATABASE_URL='dbname=assignment_harness_native' go-service/contentd migrate
if DATABASE_URL='dbname=assignment_harness_django' go-service/contentd migrate; then
  printf 'ERROR: migrated untracked reference schema\n' >&2; exit 1
fi
harness/harness operations --db 'dbname=assignment_harness_native' \
  --input go-service/contentd --output .artifacts/operations.json
reference_pid=''
candidate_pid=''
optimized_pid=''
cleanup() {
  if [[ -n "$reference_pid" ]]; then kill -TERM "$reference_pid" 2>/dev/null || true; wait "$reference_pid" || true; fi
  if [[ -n "$candidate_pid" ]]; then kill -TERM "$candidate_pid" 2>/dev/null || true; wait "$candidate_pid" || true; fi
  if [[ -n "$optimized_pid" ]]; then kill -TERM "$optimized_pid" 2>/dev/null || true; wait "$optimized_pid" || true; fi
}
trap cleanup EXIT
PGDATABASE=assignment_harness_django LISTEN_ADDR=127.0.0.1:18000 bin/reference serve >.artifacts/reference-check.log 2>&1 &
reference_pid=$!
APP_PROFILE=compat DATABASE_URL='dbname=assignment_harness_native' LISTEN_ADDR=127.0.0.1:18001 go-service/contentd >.artifacts/go-check.log 2>&1 &
candidate_pid=$!
for port in 18000 18001; do
  ready=0
  for attempt in {1..100}; do
    if curl --silent --fail "http://127.0.0.1:$port/api/users/1" >/dev/null; then ready=1; break; fi
    sleep 0.1
  done
  if [[ "$ready" == 0 ]]; then printf 'Server on port %s did not start\n' "$port" >&2; exit 1; fi
done
harness/harness verify --db 'dbname=assignment_harness_django' --url http://127.0.0.1:18000 --golden fixtures/contract
harness/harness verify --db 'dbname=assignment_harness_native' --url http://127.0.0.1:18001 --golden fixtures/contract
kill -TERM "$reference_pid"
wait "$reference_pid"
reference_pid=''
bin/optimized >.artifacts/optimized-check.log 2>&1 &
optimized_pid=$!
ready=0
for attempt in {1..100}; do
  if curl --silent --fail http://127.0.0.1:18000/api/users/1 >/dev/null; then ready=1; break; fi
  sleep 0.1
done
if [[ "$ready" == 0 ]]; then printf 'Optimized control did not start\n' >&2; exit 1; fi
harness/harness verify --db 'dbname=assignment_harness_django' --url http://127.0.0.1:18000 --golden fixtures/contract
printf 'Unit, race, smoke, migration, operational and all three contract suites passed.\n'
