#!/usr/bin/env bash

set -euo pipefail

script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
project_root="$(cd -- "${script_dir}/.." && pwd)"
port="${PLOCAL_A4_HYBRID_PORT:-18080}"
origin="http://127.0.0.1:${port}"
log_file="$(mktemp /tmp/plocal-a4-hybrid.XXXXXX.log)"
server_pid=""

cleanup() {
    if [[ -n "${server_pid}" ]] && kill -0 "${server_pid}" 2>/dev/null; then
        kill "${server_pid}"
        wait "${server_pid}" 2>/dev/null || true
    fi
    rm -f "${log_file}"
}
trap cleanup EXIT INT TERM

if [[ ! "${port}" =~ ^[0-9]+$ ]] || (( port < 1024 || port > 65535 )); then
    echo "PLOCAL_A4_HYBRID_PORT must be an integer from 1024 through 65535." >&2
    exit 2
fi

if curl --silent --fail --max-time 1 "${origin}/" >/dev/null 2>&1; then
    echo "Refusing to use occupied ${origin}; choose an unused PLOCAL_A4_HYBRID_PORT." >&2
    exit 2
fi

PLOCAL_HYBRID_PORT="${port}" "${script_dir}/serve-plocal-hybrid.sh" >"${log_file}" 2>&1 &
server_pid=$!

ready=0
for _ in {1..40}; do
    if ! kill -0 "${server_pid}" 2>/dev/null; then
        echo "Hybrid service exited before readiness." >&2
        sed -n '1,120p' "${log_file}" >&2
        exit 1
    fi
    if curl --silent --fail --max-time 1 "${origin}/" >/dev/null 2>&1; then
        ready=1
        break
    fi
    sleep 0.25
done

if (( ready == 0 )); then
    echo "Hybrid service did not become ready at ${origin}." >&2
    exit 1
fi

tests=(
    plocal-service-market.test.js
    plocal-phase-2e-hybrid.test.js
    plocal-phase-3b-hybrid.test.js
    plocal-phase-3d-hybrid.test.js
    plocal-phase-3f-hybrid.test.js
    plocal-phase-3h-hybrid.test.js
)

for test_file in "${tests[@]}"; do
    PLOCAL_HYBRID_ORIGIN="${origin}" node "${project_root}/tests/${test_file}"
done

echo "PLOCAL hybrid/public acceptance passed sequentially at ${origin}."
