#!/bin/sh
set -u

locked=0
case "$#:$*" in
    0:) ;;
    1:--locked) locked=1 ;;
    *) echo "Aufruf: 4web-kiosk-session [--locked]" >&2; exit 2 ;;
esac

if [ "$(/usr/bin/id -u)" -eq 0 ]; then
    echo "Die Kiosksitzung muss als normaler Benutzer laufen." >&2
    exit 1
fi
if [ -n "${DISPLAY:-}" ] || [ -n "${WAYLAND_DISPLAY:-}" ]; then
    echo "Keine Kiosksitzung innerhalb eines Desktops starten. Die eigene 4WEB-Sitzung muss direkt ueber greetd auf einer Linux-Konsole laufen." >&2
    exit 1
fi
case "${XDG_CURRENT_DESKTOP:-}:${XDG_SESSION_DESKTOP:-}" in
    *GNOME*|*gnome*) echo "GNOME ist noch aktiv. Die eigene 4WEB-Sitzung erst nach Abmeldung bzw. ueber greetd starten." >&2; exit 1 ;;
esac
for executable in /usr/bin/cage /usr/bin/dbus-run-session /usr/bin/setsid /usr/bin/pgrep /usr/bin/tty /usr/bin/sleep /usr/lib/4web-kiosk/kiosk-supervisor; do
    if [ ! -x "$executable" ]; then
        echo "Kiosk-Voraussetzung fehlt: $executable. Cage, dbus-user-session und die 4WEB-Systemkiosk-Einrichtung installieren." >&2
        exit 1
    fi
done
/usr/bin/pgrep -x gnome-shell >/dev/null 2>&1
gnome_status=$?
case "$gnome_status" in
    0) echo "GNOME Shell laeuft noch. Ein verschachtelter Kiosk schuetzt nicht vor Arbeitsflaechen-Gesten; ueber greetd starten." >&2; exit 1 ;;
    1) ;;
    *) echo "Der Sitzungszustand konnte nicht geprueft werden." >&2; exit 1 ;;
esac
case "$(/usr/bin/tty 2>/dev/null)" in
    /dev/tty[0-9]*) ;;
    *) echo "Die Kiosksitzung benoetigt eine echte Linux-Konsole (/dev/ttyN), keine Desktop-Terminal- oder SSH-Sitzung. Ueber greetd starten." >&2; exit 1 ;;
esac

export QT_QPA_PLATFORM=wayland
export XDG_SESSION_TYPE=wayland
export XDG_CURRENT_DESKTOP=4WebKiosk
export XKB_DEFAULT_LAYOUT="${XKB_DEFAULT_LAYOUT:-de}"
export WLR_BACKENDS=drm,libinput
export FOURWEB_KIOSK_LOCKED="$locked"
# Deliberately omit cage -s: it would enable switching to other virtual terminals.
if [ "$locked" -eq 0 ]; then
    exec /usr/bin/dbus-run-session -- /usr/bin/cage -d -- /usr/lib/4web-kiosk/kiosk-supervisor
fi

child=
child_group=0
cleanup() {
    if [ -n "$child" ]; then
        if [ "$child_group" -eq 1 ]; then
            kill -TERM "-$child" 2>/dev/null || kill -TERM "$child" 2>/dev/null || true
            # The app supervisor handles TERM and cleans its own process group.
            # Give that trap time to run before forcing the Cage group down.
            /usr/bin/sleep 2
            kill -KILL "-$child" 2>/dev/null || kill -KILL "$child" 2>/dev/null || true
        else
            kill -TERM "$child" 2>/dev/null || true
        fi
        wait "$child" 2>/dev/null || true
        child=
    fi
}
stop() {
    trap '' INT TERM HUP
    cleanup
    exit 0
}
trap stop INT TERM HUP
while :; do
    # A separate process group also contains Cage's dbus and supervisor children.
    /usr/bin/setsid /usr/bin/dbus-run-session -- /usr/bin/cage -d -- /usr/lib/4web-kiosk/kiosk-supervisor &
    child=$!
    child_group=1
    wait "$child"
    result=$?
    cleanup
    echo "4WEB-Systemkiosk: Cage wurde mit Status $result beendet; Neustart in 3 Sekunden." >&2
    /usr/bin/sleep 3 &
    child=$!
    child_group=0
    wait "$child"
    child=
done
