#!/usr/bin/env bash
# tests/run-all: Run all test suites in order (D-030)
# Invokes run-rust, run-godot, run-ipc-fixtures, run-ipc-protocol,
# run-ipc-integration, run-visual.
# Exit: 0 = all suites pass, non-zero = any suite failed
# Stdout: {"suite":"all","total":N,"passed":N,"failed":N,"duration_ms":N,"suites":[...]}
set -euo pipefail

FILTER=""
while [[ $# -gt 0 ]]; do
    case "$1" in
        --filter) FILTER="${2:-}"; shift 2 ;;
        --filter=*) FILTER="${1#--filter=}"; shift ;;
        *) echo "Unknown argument: $1" >&2; exit 2 ;;
    esac
done

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

PASS_ARGS=()
[[ -n "$FILTER" ]] && PASS_ARGS+=(--filter "$FILTER")

SUITES=(
    run-rust
    run-godot
    run-ipc-fixtures
    run-ipc-protocol
    run-ipc-integration
    run-visual
)

START_MS=$(date +%s%3N)

OVERALL_TOTAL=0
OVERALL_PASSED=0
OVERALL_FAILED=0
OVERALL_EXIT=0
SUITE_RESULTS=""

for suite in "${SUITES[@]}"; do
    script="$SCRIPT_DIR/$suite"
    if [[ ! -x "$script" ]]; then
        echo "Warning: $script not found or not executable — skipping" >&2
        continue
    fi

    SUITE_OUT=$(mktemp)
    set +e
    "$script" "${PASS_ARGS[@]}" >"$SUITE_OUT"
    SUITE_EXIT=$?
    set -e

    SUITE_JSON=$(cat "$SUITE_OUT")
    rm -f "$SUITE_OUT"

    # Accumulate totals from the suite's JSON output
    S_TOTAL=$(echo "$SUITE_JSON" | grep -oE '"total":[0-9]+' | grep -oE '[0-9]+' || echo 0)
    S_PASSED=$(echo "$SUITE_JSON" | grep -oE '"passed":[0-9]+' | grep -oE '[0-9]+' || echo 0)
    S_FAILED=$(echo "$SUITE_JSON" | grep -oE '"failed":[0-9]+' | grep -oE '[0-9]+' || echo 0)

    OVERALL_TOTAL=$(( OVERALL_TOTAL + ${S_TOTAL:-0} ))
    OVERALL_PASSED=$(( OVERALL_PASSED + ${S_PASSED:-0} ))
    OVERALL_FAILED=$(( OVERALL_FAILED + ${S_FAILED:-0} ))
    [[ $SUITE_EXIT -ne 0 ]] && OVERALL_EXIT=1

    # Build suites array for JSON
    if [[ -n "$SUITE_RESULTS" ]]; then
        SUITE_RESULTS="$SUITE_RESULTS,$SUITE_JSON"
    else
        SUITE_RESULTS="$SUITE_JSON"
    fi
done

END_MS=$(date +%s%3N)
DURATION_MS=$((END_MS - START_MS))

printf '{"suite":"all","total":%d,"passed":%d,"failed":%d,"duration_ms":%d,"suites":[%s]}\n' \
    "$OVERALL_TOTAL" "$OVERALL_PASSED" "$OVERALL_FAILED" "$DURATION_MS" "$SUITE_RESULTS"
exit $OVERALL_EXIT
