#!/bin/sh

set -eu

export HOME="$AUTOPKGTEST_TMP"
export TMPDIR="$AUTOPKGTEST_TMP"

export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export LANGUAGE=en_US:en
export NO_AT_BRIDGE=1

# shellcheck disable=SC2016
dbus-run-session -- xvfb-run bash -c '
set -eu

self_pid=$$

echo "Launching window manager"
matchbox-window-manager >/dev/null 2>&1 &
wm_pid=$!
echo "wm_pid=$wm_pid"

echo "Launching Prusa Slicer"
prusa-slicer &
prusa_slicer_pid=$!
echo "prusa_slicer_pid=$prusa_slicer_pid"

trap '\''kill $wm_pid $prusa_slicer_pid'\'' INT TERM EXIT

echo "Waiting for up to 5 minutes for PrusaSlicer windows to appear"
start=$(date +%s)
deadline=$((start + 300))

check_prusaslicer_windows() {
    if wmctrl -l 2>&1 | grep -q '\''PrusaSlicer.*Configuration Wizard'\'' &&
        wmctrl -l 2>&1 | grep -q '\''PrusaSlicer.*based on'\''; then
        return 0
    else
        return 1
    fi
}

dump_state() {
    local suffix=$1
    echo "Dumping windows list"
    wmctrl -l

    echo "Dumping screenshot"
    scrot "$AUTOPKGTEST_ARTIFACTS/screenshot-$suffix.png"
}

until check_prusaslicer_windows || [[ "$(date +%s)" -gt "$deadline" ]]; do
    sleep 1
done

if check_prusaslicer_windows; then
    elapsed=$(("$(date +%s)" - start))
    echo "Found PrusaSlicer windows after $elapsed seconds"
else
    echo "Timed out"
    dump_state "timedout"
    exit 10
fi

echo "Waiting for 60 seconds to check if PrusaSlicer crashes"
sleep 60

dump_state after

echo -n "Checking for Prusa Slicer config window..."
conf_winid=$(wmctrl -l | awk '\''/PrusaSlicer.*Configuration Wizard/ { print $1; }'\'')

if [[ -n "$conf_winid" ]]; then
    echo Found
else
    echo Missing
    exit 11
fi

echo -n "Checking for Prusa Slicer main window... "
main_winid=$(wmctrl -l | awk '\''/PrusaSlicer.*based on/ { print $1; }'\'')
if [[ -n "$main_winid" ]]; then
    echo Found
else
    echo Missing
    exit 12
fi

echo "Closing Prusa Slicer windows"
wmctrl -i -c "$conf_winid"
wmctrl -i -c "$main_winid"

echo "Waiting for prusa-slicer to exit..."
wait "$prusa_slicer_pid"
echo Done

echo "Killing window manager"
kill -TERM "$wm_pid"
echo "Waiting for window manager to exit..."
wait "$wm_pid" || true

echo "Done"
trap - INT TERM EXIT
'
