#!/bin/sh
# qrk-kiosk - startet die QRK-Kasse als Kiosk unter Xorg (Openbox, ohne Desktop).
# Wird von der Session-Datei /usr/share/xsessions/qrk-kiosk.desktop gestartet.

# Kundendisplay-Screen (0=intern, 1=zweiter Bildschirm); ueberschreibbar
# in /etc/qrk-kiosk/device.conf als CUSTOMER_SCREEN=
CUSTOMER_SCREEN="${CUSTOMER_SCREEN:-1}"
if [ -r /etc/qrk-kiosk/device.conf ]; then
    # shellcheck disable=SC1091
    . /etc/qrk-kiosk/device.conf
    CUSTOMER_SCREEN="${CUSTOMER_SCREEN:-1}"
fi

# UI-Skalierung fuer den ganzen Bildschirm (UI_SCALE in device.conf).
# Setzt X-DPI + Qt/GTK/KDE-Faktor gemeinsam (naeher am KDE-Look).
UI_SCALE="${UI_SCALE:-1.0}"
case "$UI_SCALE" in ""|1|1.0|1.00) : ;; *)
    _dpi="$(awk "BEGIN{printf \"%d\", 96*$UI_SCALE}" 2>/dev/null || echo 120)"
    command -v xrdb >/dev/null 2>&1 && printf 'Xft.dpi: %s\n' "$_dpi" | xrdb -merge 2>/dev/null
    export QT_SCALE_FACTOR="$UI_SCALE"
    export QT_AUTO_SCREEN_SCALE_FACTOR=0
    export GDK_DPI_SCALE="$UI_SCALE"
    export KDE_SCALE_FACTOR="$UI_SCALE"
    ;;
esac

# Kassen-Binary: qrk (Handel) oder qrk-gastro (Gastro), via device.conf
QRK_BINARY="${QRK_BINARY:-qrk}"
command -v "$QRK_BINARY" >/dev/null 2>&1 || QRK_BINARY=qrk

# Bildschirmschoner und DPMS deaktivieren
xset s off || true
xset -dpms || true
xset -b || true

# Optional: Kundendisplay-Ausgang drehen (CUSTOMER_ROTATION=left|right|inverted)
# in /etc/qrk-kiosk/device.conf; leer/normal = keine Drehung.
if [ -n "${CUSTOMER_ROTATION:-}" ] && [ "$CUSTOMER_ROTATION" != "normal" ] \
    && command -v xrandr >/dev/null 2>&1; then
    _out="$(xrandr --query 2>/dev/null | awk '/ connected /{print $1}' | sed -n '2p')"
    [ -n "$_out" ] && xrandr --output "$_out" --rotate "$CUSTOMER_ROTATION" 2>/dev/null || true
fi

# Optionales Hintergrundbild: WALLPAPER in device.conf ueberschreibbar,
# Standard ist das mitgelieferte QRK-Logo.
WALLPAPER="${WALLPAPER:-/usr/share/qrk-kiosk/logo_t.png}"
if command -v feh >/dev/null 2>&1 && [ -n "${WALLPAPER:-}" ] && [ -f "$WALLPAPER" ]; then
    feh --bg-fill --no-fehbg "$WALLPAPER" 2>/dev/null || true
else
    xsetroot -solid black 2>/dev/null || true
fi

# Mauszeiger auf dem Touchscreen ausblenden
if command -v unclutter >/dev/null 2>&1; then unclutter -idle 0 -root & fi

# Bildschirmtastatur (fuer Login-/Passworteingabe beim Ausstieg)
if command -v onboard >/dev/null 2>&1; then onboard --enable-background-mode & fi

# Touch-Gesten (Konfiguration: ~/.config/touchegg/touchegg.conf)
if command -v touchegg >/dev/null 2>&1; then touchegg & fi

# AnyDesk: registriert die Fernwartung fuer diese Session; Fenster liegt hinter
# der vollbildigen Kassa.
# AnyDesk: registriert die Fernwartung fuer diese Session. Das Fenster wird
# dauerhaft versteckt gehalten (auch nach Verbindungs-Ende).
if command -v anydesk >/dev/null 2>&1; then
    anydesk &
fi
if command -v wmctrl >/dev/null 2>&1; then
    ( while true; do
        for _wid in $(wmctrl -l 2>/dev/null | grep -i anydesk | awk '{print $1}'); do
            wmctrl -i -r "$_wid" -b add,hidden 2>/dev/null
        done
        sleep 5
    done ) &
fi

# Kundendisplay: Empfaenger fuer die Belege der Kassa auf dem 2. Bildschirm.
# Nur starten, wenn auch wirklich ein zweiter Ausgang verbunden ist (sonst
# wuerde das Fenster den Haupt-Bildschirm "sperren").
if command -v qrkcustomerdisplay >/dev/null 2>&1; then
    _displays="$(xrandr --query 2>/dev/null | grep -c ' connected')"
    if [ "${_displays:-0}" -ge 2 ]; then
        qrkcustomerdisplay --screen "$CUSTOMER_SCREEN" &
    fi
fi

# Leichter Fenstermanager, bewusst ohne Desktop/Chrome
openbox &

# Qt-Theme wie in Plasma: KDE-Platform-Theme mit BreezeDark/BreezeLight
# (kein QSS -> QRKs eigene Widgets werden nicht ueberschrieben).
_theme_scheme="BreezeLight"
[ "${QT_THEME:-light}" = "dark" ] && _theme_scheme="BreezeDark"
if [ -f "/usr/share/color-schemes/${_theme_scheme}.colors" ]; then
    mkdir -p /home/kassa/.config
    {
        echo "[General]"
        echo "ColorScheme=${_theme_scheme}"
    } > /home/kassa/.config/kdeglobals
    chown kassa:kassa /home/kassa/.config/kdeglobals
    export QT_QPA_PLATFORMTHEME=kde
fi

# Marker: kiosk-admin setzt qrk-exit (Session beenden); qrk-update setzt
# qrk-restart (Kasse neu starten).
EXIT_MARKER="${XDG_RUNTIME_DIR:-/tmp}/qrk-exit"
RESTART_MARKER="${XDG_RUNTIME_DIR:-/tmp}/qrk-restart"
rm -f "$EXIT_MARKER"

# Kasse im Vollbild. Dark kommt ueber das KDE-Theme (BreezeDark);
# nur falls kein Breeze-Schema verfuegbar ist, als Fallback das QSS nutzen.
QRK_ARGS="-f"
if [ "${QT_THEME:-light}" = "dark" ] \
    && [ ! -f /usr/share/color-schemes/BreezeDark.colors ] \
    && [ -f /usr/share/qrk-kiosk/themes/dark.qss ]; then
    QRK_ARGS="$QRK_ARGS -s /usr/share/qrk-kiosk/themes/dark.qss"
fi

# - Restart-Marker -> neu starten (Update/Service, KEIN Session-Ende)
# - Exitcode 0 ("QRK beenden") ODER Exit-Marker -> Session sauber beenden
# - sonst (Absturz) -> nach kurzer Pause neu starten
while true; do
    # shellcheck disable=SC2086
    "$QRK_BINARY" $QRK_ARGS
    code=$?
    if [ -e "$RESTART_MARKER" ]; then
        rm -f "$RESTART_MARKER"
        sleep 1
        continue
    fi
    if [ "$code" -eq 0 ] || [ -e "$EXIT_MARKER" ]; then
        rm -f "$EXIT_MARKER"
        break
    fi
    sleep 2
done

# Sauberes Ende der Session (kein loginctl-Terminate -> Greeter erscheint).
exit 0