#!/bin/sh
set -eu

PYTEST_EXPR='not test_name and not test_loopback_ and not test_default_'

runtime_dir="$(mktemp -d)"
export XDG_RUNTIME_DIR="$runtime_dir"

audio_mode=""
pipewire_pid=""
pipewire_pulse_pid=""

cleanup() {
    if [ "$audio_mode" = "pulseaudio" ]; then
        pulseaudio --kill >/dev/null 2>&1 || true
    else
        [ -n "$pipewire_pulse_pid" ] && kill "$pipewire_pulse_pid" >/dev/null 2>&1 || true
        [ -n "$pipewire_pid" ] && kill "$pipewire_pid" >/dev/null 2>&1 || true
    fi
    rm -rf "$runtime_dir"
}
trap cleanup EXIT INT TERM

if command -v pulseaudio >/dev/null 2>&1; then
    audio_mode="pulseaudio"
    pulseaudio --daemonize=yes --exit-idle-time=-1 --log-target=stderr
elif command -v pipewire >/dev/null 2>&1 && command -v pipewire-pulse >/dev/null 2>&1; then
    audio_mode="pipewire-pulse"
    pipewire >"$runtime_dir/pipewire.log" 2>&1 &
    pipewire_pid="$!"
    pipewire-pulse >"$runtime_dir/pipewire-pulse.log" 2>&1 &
    pipewire_pulse_pid="$!"
else
    echo "No supported PulseAudio server available (need pulseaudio or pipewire-pulse)" >&2
    exit 1
fi

for _i in 1 2 3 4 5 6 7 8 9 10; do
    if [ -S "$XDG_RUNTIME_DIR/pulse/native" ]; then
        break
    fi
    sleep 0.2
done

if [ ! -S "$XDG_RUNTIME_DIR/pulse/native" ]; then
    echo "PulseAudio socket did not appear at $XDG_RUNTIME_DIR/pulse/native" >&2
    [ -f "$runtime_dir/pipewire.log" ] && tail -n 50 "$runtime_dir/pipewire.log" || true
    [ -f "$runtime_dir/pipewire-pulse.log" ] && tail -n 50 "$runtime_dir/pipewire-pulse.log" || true
    exit 1
fi

for py in $(py3versions --supported); do
    case "$py" in
        python3.*) pybin="$py" ;;
        *) pybin="python$py" ;;
    esac
    "$pybin" -m pytest -k "$PYTEST_EXPR" test_soundcard.py
done
