#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
cd "$ROOT"
BASE_TMP="$(mktemp -d /tmp/healthmanager-browser-matrix.XXXXXX)"
SERVER_PID=""
cleanup_server() { if [[ -n "$SERVER_PID" ]]; then kill "$SERVER_PID" 2>/dev/null || true; wait "$SERVER_PID" 2>/dev/null || true; SERVER_PID=""; fi; }
cleanup() { cleanup_server; rm -rf "$BASE_TMP"; }
trap cleanup EXIT INT TERM
port() { python3 -c 'import socket;s=socket.socket();s.bind(("127.0.0.1",0));print(s.getsockname()[1]);s.close()'; }
prepare() {
  local name="$1" flag="${2:-}" dir="$BASE_TMP/$name"
  mkdir -m 700 "$dir"; python3 tests/fixtures/dashboard_v5_fixture.py "$dir/fixture.db" >/dev/null; chmod 600 "$dir/fixture.db"
  if [[ "$flag" == "prototype" ]]; then
    python3 scripts/health/health_dashboard_v5.py --db "$dir/fixture.db" --output "$dir/v5.html" --today 2026-06-15 --generated-at 2026-06-15T12:00:00+00:00 --echarts-prototype >/dev/null
  elif [[ "$flag" == "7c-c" ]]; then
    python3 tests/fixtures/dashboard_v5_sprint7c_a_fixture.py "$dir/fixture.db"
    python3 tests/fixtures/dashboard_v5_original_fixture.py --db "$dir/fixture.db" --root "$dir/originals"
    python3 scripts/health/health_dashboard_v5.py --db "$dir/fixture.db" --output "$dir/v5.html" --today 2026-06-15 --generated-at 2026-06-15T12:00:00+00:00 --health-record-6e >/dev/null
    python3 tests/fixtures/dashboard_v5_sprint7c_b_fixture.py "$dir/fixture.db"
    python3 tests/fixtures/dashboard_v5_sprint7c_c_fixture.py "$dir/fixture.db"
  elif [[ "$flag" == "7c-b" ]]; then
    python3 tests/fixtures/dashboard_v5_sprint7c_a_fixture.py "$dir/fixture.db"
    python3 tests/fixtures/dashboard_v5_original_fixture.py --db "$dir/fixture.db" --root "$dir/originals"
    python3 scripts/health/health_dashboard_v5.py --db "$dir/fixture.db" --output "$dir/v5.html" --today 2026-06-15 --generated-at 2026-06-15T12:00:00+00:00 --health-record-6e >/dev/null
    python3 tests/fixtures/dashboard_v5_sprint7c_b_fixture.py "$dir/fixture.db"
  elif [[ "$flag" == "7c-a" ]]; then
    python3 tests/fixtures/dashboard_v5_sprint7c_a_fixture.py "$dir/fixture.db"
    python3 tests/fixtures/dashboard_v5_original_fixture.py --db "$dir/fixture.db" --root "$dir/originals"
    python3 scripts/health/health_dashboard_v5.py --db "$dir/fixture.db" --output "$dir/v5.html" --today 2026-06-15 --generated-at 2026-06-15T12:00:00+00:00 --health-record-6e >/dev/null
  elif [[ "$flag" == "7c-e" ]]; then
    python3 tests/fixtures/dashboard_v5_sprint7c_e_fixture.py "$dir/fixture.db"
    python3 scripts/health/health_dashboard_v5.py --db "$dir/fixture.db" --output "$dir/v5.html" --today 2026-06-15 --generated-at 2026-06-15T12:00:00+00:00 --health-record-6e >/dev/null
  elif [[ "$flag" == "7c-d" ]]; then
    python3 tests/fixtures/dashboard_v5_sprint7c_d_fixture.py "$dir/fixture.db"
    python3 scripts/health/health_dashboard_v5.py --db "$dir/fixture.db" --output "$dir/v5.html" --today 2026-06-15 --generated-at 2026-06-15T12:00:00+00:00 --health-record-6e >/dev/null
  elif [[ "$flag" == "record" || "$flag" == "record-files" ]]; then
    if [[ "$flag" == "record-files" ]]; then python3 tests/fixtures/dashboard_v5_original_fixture.py --db "$dir/fixture.db" --root "$dir/originals"; fi
    python3 scripts/health/health_dashboard_v5.py --db "$dir/fixture.db" --output "$dir/v5.html" --today 2026-06-15 --generated-at 2026-06-15T12:00:00+00:00 --health-record-6e >/dev/null
  elif [[ "$flag" == "calendar" ]]; then
    python3 scripts/health/health_dashboard_v5.py --db "$dir/fixture.db" --output "$dir/v5.html" --today 2026-06-15 --generated-at 2026-06-15T12:00:00+00:00 --calendar-day-6d >/dev/null
  elif [[ "$flag" == "explorer" ]]; then
    python3 scripts/health/health_dashboard_v5.py --db "$dir/fixture.db" --output "$dir/v5.html" --today 2026-06-15 --generated-at 2026-06-15T12:00:00+00:00 --explorer-6c >/dev/null
  elif [[ "$flag" == "6k-a" ]]; then
    python3 -c 'import sqlite3,sys;c=sqlite3.connect(sys.argv[1]);c.execute("CREATE TABLE nutrition_reference_profile (birth_date TEXT NOT NULL,sex TEXT NOT NULL,life_stage TEXT,activity_level TEXT,body_weight_kg REAL,phytate_mg_per_day REAL,active INTEGER NOT NULL)");c.execute("INSERT INTO nutrition_reference_profile VALUES (?,?,?,?,?,?,1)",( "1986-01-01","male",None,"moderate",80.0,600.0));c.commit();c.close()' "$dir/fixture.db"
    python3 scripts/health/health_dashboard_v5.py --db "$dir/fixture.db" --output "$dir/v5.html" --today 2026-06-15 --generated-at 2026-06-15T12:00:00+00:00 --health-record-6e >/dev/null
  else
    python3 scripts/health/health_dashboard_v5.py --db "$dir/fixture.db" --output "$dir/v5.html" --today 2026-06-15 --generated-at 2026-06-15T12:00:00+00:00 >/dev/null
  fi
  printf '<html>synthetic v4</html>' > "$dir/v4.html"; python3 -c 'import secrets;print(secrets.token_urlsafe(32))' > "$dir/token"; chmod 600 "$dir/token"; mkdir -m 700 "$dir/actions" "$dir/capture-quarantine" "$dir/capture-media" "$dir/document-quarantine" "$dir/document-storage"
}
start_server() {
  local name="$1" p="$2" dir="$BASE_TMP/$name"
  local token today="2026-06-15"; token="$(< "$dir/token")"; if [[ "$name" == "7c-b" || "$name" == "7c-c" ]]; then today="2026-06-16"; fi
  local roots=(); if [[ -d "$dir/originals" ]]; then roots+=("HEALTH_DASHBOARD_ORIGINAL_ROOTS=$dir/originals"); fi
  env -u HEALTH_DASHBOARD_BASIC_PASSWORD_FILE "${roots[@]}" HEALTH_DASHBOARD_HOST="127.0.0.1" HEALTH_DASHBOARD_FILE="$dir/v4.html" HEALTH_DASHBOARD_V5_FILE="$dir/v5.html" HEALTH_DASHBOARD_DB="$dir/fixture.db" HEALTH_DASHBOARD_ASSET_DIR="$ROOT/scripts/health/assets/health-assets" HEALTH_DASHBOARD_API_TOKEN_FILE="$dir/token" HEALTH_DASHBOARD_ACTION_INBOX="$dir/actions" HEALTH_DASHBOARD_CAPTURE_QUARANTINE="$dir/capture-quarantine" HEALTH_DASHBOARD_CAPTURE_MEDIA="$dir/capture-media" HEALTH_DASHBOARD_DOCUMENT_QUARANTINE="$dir/document-quarantine" HEALTH_DASHBOARD_DOCUMENT_STORAGE="$dir/document-storage" HEALTH_DASHBOARD_TEST_INSTANCE_ID="matrix_${name}" HEALTH_DASHBOARD_TEST_TODAY="$today" HEALTH_DASHBOARD_PORT="$p" python3 scripts/health/health_dashboard_server.py >"$dir/server.log" 2>&1 & SERVER_PID=$!
  for _ in $(seq 1 30); do curl -fsS -u "health:$token" "http://127.0.0.1:$p/health-dashboard-v5" >/dev/null && return; sleep .2; done
  printf '%s\n' "synthetic browser server failed to become ready" >&2
  python3 -c 'import sys;print("".join(open(sys.argv[1],encoding="utf-8",errors="replace").readlines()[:120]),end="")' "$dir/server.log" >&2
  return 1
}
run_group() {
  local name="$1" flag="$2" spec="$3" grep_arg="${4:-}" p; p="$(port)"; prepare "$name" "$flag"; start_server "$name" "$p"
  local dir="$BASE_TMP/$name" token; token="$(< "$dir/token")"; if [[ -n "$grep_arg" ]]; then
    HEALTH_DASHBOARD_TEST_URL="http://127.0.0.1:$p" HEALTH_DASHBOARD_TEST_PASSWORD="$token" HEALTH_DASHBOARD_TEST_INSTANCE_ID="matrix_${name}" HEALTH_DASHBOARD_TEST_ACTION_INBOX="$dir/actions" HEALTH_DASHBOARD_TEST_DB="$dir/fixture.db" HEALTH_DASHBOARD_TEST_V5_FILE="$dir/v5.html" npx playwright test "$spec" --workers=1 "$grep_arg"
  else
    HEALTH_DASHBOARD_TEST_URL="http://127.0.0.1:$p" HEALTH_DASHBOARD_TEST_PASSWORD="$token" HEALTH_DASHBOARD_TEST_INSTANCE_ID="matrix_${name}" HEALTH_DASHBOARD_TEST_ACTION_INBOX="$dir/actions" HEALTH_DASHBOARD_TEST_DB="$dir/fixture.db" HEALTH_DASHBOARD_TEST_V5_FILE="$dir/v5.html" npx playwright test "$spec" --workers=1
  fi
  cleanup_server
}
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "standard" ]]; then
  run_group standard "" tests/browser/dashboard_v5.spec.js "--grep-invert=Sprint 5C mobile capture"
  printf 'browser_group=standard passed synthetic_only=true\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "calendar" ]]; then
  run_group calendar calendar tests/browser/dashboard_v5_calendar_day_6d.spec.js
  printf 'browser_group=calendar passed synthetic_only=true\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "record" ]]; then
  run_group record record tests/browser/dashboard_v5_record_6e.spec.js
  printf 'browser_group=record passed synthetic_only=true\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "record-files" ]]; then
  run_group record-files record-files tests/browser/dashboard_v5_record_original_6e4b.spec.js
  printf 'browser_group=record-files passed synthetic_only=true\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "a1" ]]; then
  run_group a1 record-files tests/browser/dashboard_v5_sprint6g_a1.spec.js
  printf 'browser_group=a1 passed synthetic_only=true\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "a2" ]]; then
  run_group a2 record-files tests/browser/dashboard_v5_sprint6g_a2.spec.js
  printf 'browser_group=a2 passed synthetic_only=true\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "a3" ]]; then
  run_group a3 record-files tests/browser/dashboard_v5_sprint6g_a3.spec.js
  printf 'browser_group=a3 passed synthetic_only=true\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "b1" ]]; then
  run_group b1 record-files tests/browser/dashboard_v5_sprint6g_b1.spec.js
  printf 'browser_group=b1 passed synthetic_only=true\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "b2" ]]; then
  run_group b2 record-files tests/browser/dashboard_v5_sprint6g_b2.spec.js
  printf 'browser_group=b2 passed synthetic_only=true\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "b3" ]]; then
  run_group b3 record-files tests/browser/dashboard_v5_sprint6g_b3.spec.js
  printf 'browser_group=b3 passed synthetic_only=true\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "6f-a" ]]; then
  run_group 6f-a record tests/browser/dashboard_v5_sprint6f_a.spec.js
  printf 'browser_group=6f-a passed synthetic_only=true\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "nutrition" ]]; then
  run_group nutrition record tests/browser/dashboard_v5_sprint6g_echarts.spec.js
  printf 'browser_group=nutrition passed synthetic_only=true\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "6k-a" ]]; then
  run_group 6k-a 6k-a tests/browser/dashboard_v5_sprint6k_a.spec.js
  printf 'browser_group=6k-a passed synthetic_only=true scenarios=4\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "7a-rc" ]]; then
  run_group 7a-rc record-files tests/browser/dashboard_v5_sprint6j_c.spec.js
  printf 'browser_group=7a-rc passed synthetic_only=true scenarios=6\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "7a-r1" ]]; then
  run_group 7a-r1 record-files tests/browser/dashboard_v5_sprint7a_r1.spec.js
  printf 'browser_group=7a-r1 passed synthetic_only=true scenarios=6\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "7b" ]]; then
  run_group 7b record-files tests/browser/dashboard_v5_sprint7b.spec.js
  printf 'browser_group=7b passed synthetic_only=true scenarios=4\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "7c-a" ]]; then
  run_group 7c-a 7c-a tests/browser/dashboard_v5_sprint7c_a.spec.js
  printf 'browser_group=7c-a passed synthetic_only=true scenarios=5\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "7c-b" ]]; then
  run_group 7c-b 7c-b tests/browser/dashboard_v5_sprint7c_b.spec.js
  printf 'browser_group=7c-b passed synthetic_only=true scenarios=6\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "calendar" ]]; then
  run_group calendar calendar tests/browser/dashboard_v5_calendar_day_6d.spec.js
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "record" ]]; then
  run_group record record tests/browser/dashboard_v5_record_6e.spec.js
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "record-files" ]]; then
  run_group record-files record-files tests/browser/dashboard_v5_record_original_6e4b.spec.js
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "nutrition" ]]; then
  run_group nutrition record tests/browser/dashboard_v5_sprint6g_echarts.spec.js
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "a3" ]]; then
  run_group a3 record-files tests/browser/dashboard_v5_sprint6g_a3.spec.js
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "b1" ]]; then
  run_group b1 record-files tests/browser/dashboard_v5_sprint6g_b1.spec.js
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "explorer" ]]; then
  run_group explorer record tests/browser/dashboard_v5_explorer_6c.spec.js
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "7c-c" ]]; then
  run_group 7c-c 7c-c tests/browser/dashboard_v5_sprint7c_c.spec.js
  printf 'browser_group=7c-c passed synthetic_only=true scenarios=6\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "7c-d" ]]; then
  run_group 7c-d 7c-d tests/browser/dashboard_v5_sprint7c_d.spec.js
  printf 'browser_group=7c-d passed synthetic_only=true scenarios=7\n'
  exit 0
fi
if [[ "${HEALTH_DASHBOARD_BROWSER_GROUP:-}" == "7c-e" ]]; then
  run_group 7c-e 7c-e tests/browser/dashboard_v5_sprint7c_e.spec.js
  printf 'browser_group=7c-e passed synthetic_only=true scenarios=5\n'
  exit 0
fi
run_group standard "" tests/browser/dashboard_v5.spec.js "--grep-invert=Sprint 5C mobile capture"
run_group capture "" tests/browser/dashboard_v5.spec.js "--grep=Sprint 5C mobile capture"
run_group prototype prototype tests/browser/dashboard_v5_echarts_prototype.spec.js
run_group api explorer tests/browser/dashboard_v5_api_session.spec.js
run_group explorer record tests/browser/dashboard_v5_explorer_6c.spec.js
run_group calendar calendar tests/browser/dashboard_v5_calendar_day_6d.spec.js
run_group record-standard "" tests/browser/dashboard_v5_record_standard_6e1.spec.js
run_group record record tests/browser/dashboard_v5_record_6e.spec.js
run_group record-files record-files tests/browser/dashboard_v5_record_original_6e4b.spec.js
run_group nutrition record tests/browser/dashboard_v5_sprint6g_echarts.spec.js
run_group a1 record-files tests/browser/dashboard_v5_sprint6g_a1.spec.js
run_group a2 record-files tests/browser/dashboard_v5_sprint6g_a2.spec.js
run_group a3 record-files tests/browser/dashboard_v5_sprint6g_a3.spec.js
run_group b1 record-files tests/browser/dashboard_v5_sprint6g_b1.spec.js
run_group 7c-d 7c-d tests/browser/dashboard_v5_sprint7c_d.spec.js
run_group 7c-e 7c-e tests/browser/dashboard_v5_sprint7c_e.spec.js
printf 'browser_matrix=passed synthetic_only=true groups=16\n'
