#!/bin/sh
set -e

log_msg() {
    echo "[$(date +%T)] $1"
}

log_msg "=== [START] Debian Autopkgtest for MuSE Application Loop ==="

log_msg "Step 1: Setting up isolated environment..."
export XDG_RUNTIME_DIR=$(mktemp -d)
export HOME=$(mktemp -d)
log_msg "-> Temporary XDG_RUNTIME_DIR created at: $XDG_RUNTIME_DIR"
log_msg "-> Temporary HOME created at: $HOME"

# Prevent JACK from trying to reserve hardware via D-Bus
export JACK_NO_AUDIO_RESERVATION=1
log_msg "-> Disabled D-Bus audio hardware reservation (JACK_NO_AUDIO_RESERVATION=1)"

log_msg "Step 1b: Generating local .jackdrc to enforce container-safe flags..."
cat << 'EOF' > "$HOME/.jackdrc"
/usr/bin/jackd --no-realtime --no-mlock -d dummy
EOF
log_msg "-> Successfully wrote .jackdrc configuration:"
echo "----------------------------------------"
cat "$HOME/.jackdrc"
echo "----------------------------------------"

cleanup() {
    echo ""
    log_msg "=== [CLEANUP] Cleaning up background processes ==="
    if [ -n "$MUSE_PID" ]; then
        log_msg "-> Terminating MuSE (PID: $MUSE_PID)..."
        kill "$MUSE_PID" 2>/dev/null || true
    fi
    if [ -n "$XVFB_PID" ] || killall Xvfb 2>/dev/null; then
        log_msg "-> Terminating virtual X server..."
        kill "$XVFB_PID" 2>/dev/null || true
    fi
    if killall jackd 2>/dev/null; then
        log_msg "-> Terminating auto-spawned jackd processes..."
    fi
    log_msg "-> Removing temporary directories..."
    rm -rf "$XDG_RUNTIME_DIR" "$HOME"
    log_msg "=== [CLEANUP] Done ==="
}
trap cleanup EXIT

log_msg "Step 2: Starting virtual X server (Xvfb) on display :99..."
Xvfb :99 -screen 0 1024x768x16 > /dev/null 2>&1 &
XVFB_PID=$!
export DISPLAY=:99
log_msg "-> Xvfb running in background with PID: $XVFB_PID. Waiting 1 second for initialization..."
sleep 1

log_msg "Step 3: Launching MuSE GUI Sequencer..."
log_msg "-> Spawning 'muse' process and redirecting output to /tmp/muse_output.log..."
muse > /tmp/muse_output.log 2>&1 &
MUSE_PID=$!
log_msg "-> MuSE is running in background with PID: $MUSE_PID."

log_msg "Step 4: Monitoring startup logs for the main application loop..."
MUSE_SUCCESS=false

# Give it up to 20 seconds (40 * 0.5s) to complete initialization
for i in $(seq 1 40); do
    if grep -q "Start application loop..." /tmp/muse_output.log 2>/dev/null; then
        echo ""
        log_msg "=========================================================="
        log_msg "SUCCESS: MuSE entered its main application loop successfully!"
        log_msg "=========================================================="
        MUSE_SUCCESS=true
        break
    fi

    # Check if the process died prematurely
    if ! kill -0 "$MUSE_PID" 2>/dev/null; then
        echo ""
        log_msg "ERROR: MuSE process crashed unexpectedly during startup." >&2
        log_msg "--- Captured MuSE Crash Logs ---" >&2
        cat /tmp/muse_output.log >&2
        log_msg "--------------------------------" >&2
        exit 1
    fi

    if [ $((i % 4)) -eq 0 ]; then
        log_msg "-> Still waiting for application loop... (Elapsed: $((i / 2)) seconds)"
    fi
    sleep 0.5
done

if [ "$MUSE_SUCCESS" = "false" ]; then
    echo ""
    log_msg "ERROR: MuSE failed to reach the application loop within the timeout period." >&2
    log_msg "--- Captured MuSE Logs ---" >&2
    cat /tmp/muse_output.log >&2
    log_msg "--------------------------" >&2
    exit 1
fi

log_msg "Step 5: Printing final startup telemetry from MuSE logs..."
echo "----------------------------------------"
grep -E "Init|Scan|Theme|time" /tmp/muse_output.log || true
echo "----------------------------------------"

log_msg "=== [END] Runtime test completed with status PASS ==="
exit 0
