#!/usr/bin/env bash
# Explicit opt-in integration test, RUN ON YMSERVER only, with sudo mysql/php.
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
DB=yachtmemory_catalog_v2_test
RECEIVER="$ROOT/receiver/ym-catalog-v2-test-receiver.php"

echo '=== CHECK: database/schema and untouched fixture state ==='
# The fixture DB was created in the previous phase; never create/modify production schemas.
if ! sudo mysql -N -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='$DB'" | grep -qx "$DB"; then
  echo 'ABORT: Isolated test database not present'; exit 1
fi
if [[ "$(sudo mysql -N "$DB" -e 'SELECT COUNT(*) FROM telemetry_vessels WHERE vessel_key="wildbad-test"')" != '1' ]]; then
  echo 'ABORT: fixture vessel missing'; exit 1
fi
if [[ "$(sudo mysql -N "$DB" -e 'SELECT COUNT(*) FROM signalk_catalog_snapshots_v2')" != '0' ]]; then
  echo 'ABORT: test snapshots exist; this is a one-shot script'; exit 1
fi
if [[ "$(sudo mysql -N "$DB" -e 'SELECT COUNT(*) FROM signalk_catalog_active_v2')" != '0' ]]; then
  echo 'ABORT: active catalog exists'; exit 1
fi
if ! grep -q "const DB_NAME = 'yachtmemory_catalog_v2_test'" "$RECEIVER"; then
  echo 'ABORT: unexpected receiver DB target'; exit 1
fi
php -l "$RECEIVER"

run() { sudo php "$RECEIVER" < "$1"; }

expect() {
  local file="$1" status="$2" got
  got="$(run "$file")"
  printf '%s\n' "$got"
  python3 - "$status" "$got" <<'PY'
import json,sys
want=sys.argv[1]
obj=json.loads(sys.argv[2])
assert obj['ok'] is True and obj['status']==want, (want,obj)
PY
}

echo '=== 1: Stage revision 1 and reject incomplete finalize ==='
D=fixtures/revision-1
expect "$D/header.json" staged
expect "$D/finalize.json" incomplete
# Out-of-order chunks: second then first
expect "$D/chunk-001.json" staged
expect "$D/chunk-001.json" already_staged
expect "$D/finalize.json" incomplete
expect "$D/chunk-000.json" staged
expect "$D/finalize.json" activated
expect "$D/finalize.json" already_active

echo '=== 2: 801 records, more than one chunk, out of order ==='
D=fixtures/revision-2
expect "$D/header.json" staged
for f in $(find "$D" -maxdepth 1 -name 'chunk-*.json' | sort -r); do
  expect "$f" staged
done
expect "$D/finalize.json" activated
expect "$D/finalize.json" already_active

echo '=== 3: inspect DB ==='
sudo mysql "$DB" -e '
SELECT revision,status,expected_records,expected_chunks FROM signalk_catalog_snapshots_v2 ORDER BY revision;
SELECT revision FROM signalk_catalog_active_v2;
SELECT COUNT(*) AS current_paths FROM signalk_catalog_paths_v2 WHERE currently_observed=1;
SELECT COUNT(*) AS current_observations FROM signalk_catalog_observations_v2 WHERE currently_observed=1;
SELECT COUNT(*) AS retired_paths FROM signalk_catalog_paths_v2 WHERE currently_observed=0;
'
[[ "$(sudo mysql -N "$DB" -e 'SELECT revision FROM signalk_catalog_active_v2')" == '2' ]]
[[ "$(sudo mysql -N "$DB" -e 'SELECT COUNT(*) FROM signalk_catalog_paths_v2 WHERE currently_observed=1')" == '400' ]]
[[ "$(sudo mysql -N "$DB" -e 'SELECT COUNT(*) FROM signalk_catalog_observations_v2 WHERE currently_observed=1')" == '400' ]]
echo '=== MYSQL TEST PASS ==='
