#!/bin/sh
# libershare-sbc-kiosk-launcher — starts X + WM + libershare + force fullscreen
# Invoked by libershare-sbc-kiosk.service or manually
set -eu

CONF="/etc/libershare/sbc-kiosk.conf"
[ -f "$CONF" ] && . "$CONF"

LIBERSHARE_BIN="${LIBERSHARE_BIN:-/usr/bin/libershare}"
LIBERSHARE_ARGS="${LIBERSHARE_ARGS:-}"
KIOSK_WM="${KIOSK_WM:-matchbox-window-manager -use_titlebar no -use_desktop_mode plain}"
KIOSK_HIDE_CURSOR_IDLE="${KIOSK_HIDE_CURSOR_IDLE:-3}"
KIOSK_NO_BLANK="${KIOSK_NO_BLANK:-1}"
KIOSK_FULLSCREEN_METHOD="${KIOSK_FULLSCREEN_METHOD:-wmctrl}"
KIOSK_FULLSCREEN_DELAY="${KIOSK_FULLSCREEN_DELAY:-3}"
KIOSK_WINDOW_NAME="${KIOSK_WINDOW_NAME:-libershare}"

if [ ! -x "$LIBERSHARE_BIN" ]; then
    echo "FATAL: $LIBERSHARE_BIN not found or not executable. Install libershare-desktop-app." >&2
    exit 1
fi

# pam_systemd sets per-user XDG_RUNTIME_DIR via PAMName=login, but when the
# launcher runs outside that path (manual ExecStart, sudo, etc.) the unit's
# Environment= default of /run/user/1000 is wrong for any non-1000 UID
# (libershare user has UID 30000 on Joshua-Riek noble images). Recompute.
export XDG_RUNTIME_DIR="/run/user/$(id -u)"

# Generate xinitrc dynamically
XINITRC=$(mktemp /tmp/libershare-sbc-xinitrc.XXXXXX)
trap 'rm -f "$XINITRC"' EXIT

cat > "$XINITRC" <<XINITRC_EOF
#!/bin/sh
# Auto-generated by libershare-sbc-kiosk-launcher

# Disable screen blanking
if [ "${KIOSK_NO_BLANK}" = "1" ]; then
    xset s off
    xset -dpms
    xset s noblank
fi

# Hide cursor on idle
if [ "${KIOSK_HIDE_CURSOR_IDLE}" -gt 0 ] 2>/dev/null; then
    unclutter -idle ${KIOSK_HIDE_CURSOR_IDLE} -root &
fi

# Window manager (matchbox = single-window fullscreen by default)
${KIOSK_WM} &

# Wait briefly so WM grabs the root window
sleep 0.5

# Force-fullscreen helper: runs in background while libershare starts up.
# Tauri windows are NOT fullscreen by default — we apply EWMH state
# after KIOSK_FULLSCREEN_DELAY sec.
# Polling window — 30s total (delay + 30 attempts × 1s) covers cold-start
# Tauri (WebKit + bun lish-backend init) on slow SBCs.
case "${KIOSK_FULLSCREEN_METHOD}" in
    wmctrl)
        (
            sleep ${KIOSK_FULLSCREEN_DELAY}
            i=0
            while [ \$i -lt 30 ]; do
                if wmctrl -l 2>/dev/null | grep -qi '${KIOSK_WINDOW_NAME}'; then
                    wmctrl -r '${KIOSK_WINDOW_NAME}' -b add,fullscreen 2>/dev/null && break
                fi
                i=\$((i+1))
                sleep 1
            done
        ) &
        ;;
    xdotool)
        (
            sleep ${KIOSK_FULLSCREEN_DELAY}
            i=0
            while [ \$i -lt 30 ]; do
                WID=\$(xdotool search --name '${KIOSK_WINDOW_NAME}' 2>/dev/null | head -1)
                if [ -n "\$WID" ]; then
                    xdotool key --window "\$WID" F11 2>/dev/null && break
                fi
                i=\$((i+1))
                sleep 1
            done
        ) &
        ;;
    none)
        ;;
esac

# Launch LiberShare (Tauri) — exec replaces shell so X exits when libershare quits
exec ${LIBERSHARE_BIN} ${LIBERSHARE_ARGS}
XINITRC_EOF

chmod +x "$XINITRC"

# startx with our xinitrc on the next free display
exec startx "$XINITRC" -- :0 -nolisten tcp -nocursor
