#!/bin/sh

# Crustace session init — bind compositor hotkeys, spawn helper daemons,
# then exec the shell. Daemoned by forge via `forge --exec` after the
# Wayland socket and IPC are ready, so `forge msg` calls work here.

# Do NOT use set -e: a missing optional tool must not kill the session.

# Env import is done by forge in `register_socket()` before this script runs.

# Clear stale failed-activation cache from prior session (gnome-console 25s hang).
systemctl --user reset-failed 2>/dev/null || true
systemctl --user start --no-block xdg-desktop-portal-gtk.service 2>/dev/null || true

if [ "${FORGE_MOBILE}" = "1" ]; then
	# --- Mobile-only bindings ---

	systemd-inhibit --what handle-power-key sleep infinity &

	forge msg bind-key --trigger press '*' XF86PowerOff bash -c \
		"sleep 0 0 0 0 0 0 0 0.5 && \
			if [ \"\$(forge msg dpms)\" == \"on\" ]; then \
				(tremor 150 0 1; tzompantli) \
			fi"

	forge msg bind-key --trigger release '*' XF86PowerOff bash -c \
		"if pkill -SIGINT -xf \"sleep 0 0 0 0 0 0 0 0.5\"; then \
			if [ \"\$(forge msg dpms)\" == \"on\" ]; then \
				forge msg dpms off; \
			else \
				forge msg dpms on; \
			fi \
		fi"

	forge msg bind-key --trigger press '*' XF86PowerOff+XF86AudioLowerVolume bash -c \
		"pkill -SIGINT -xf \"sleep 0 0 0 0 0 0 0 0.5\"; \
		tremor 150 0 1; \
		geometry=\$(slurp 2>&1); \
		if [[ \$geometry == \"selection cancelled\" ]]; then \
			grim /tmp/screenshot.png; \
		else \
			grim -g \"\$geometry\" /tmp/screenshot.png; \
		fi"

	forge msg bind-key '*' EnableVirtualKeyboard \
		busctl call --user sm.puri.OSK0 /sm/puri/OSK0 sm.puri.OSK0 SetVisible b true
	forge msg bind-key '*' AutoVirtualKeyboard \
		busctl call --user sm.puri.OSK0 /sm/puri/OSK0 sm.puri.OSK0 SetVisible b false

	gsettings set org.gnome.desktop.a11y.applications screen-keyboard-enabled true 2>/dev/null || true

	command -v squeekboard >/dev/null 2>&1 && squeekboard &
	command -v epitaph     >/dev/null 2>&1 && epitaph     &

	if command -v swayidle >/dev/null 2>&1; then
		swayidle -w \
			timeout 180 'forge msg dpms off' \
				resume 'forge msg dpms on' \
			timeout 210 'systemctl suspend' \
				after-resume 'forge msg dpms on' &
	fi

else
	# --- Laptop / desktop bindings ---

	KB_LAYOUT="${FORGE_KB_LAYOUT:-}"
	KB_VARIANT=""
	KB_MODEL=""
	KB_OPTIONS=""
	if [ -z "$KB_LAYOUT" ] && [ -r /etc/default/keyboard ]; then
		. /etc/default/keyboard
		KB_LAYOUT="$XKBLAYOUT"
		KB_VARIANT="$XKBVARIANT"
		KB_MODEL="$XKBMODEL"
		KB_OPTIONS="$XKBOPTIONS"
	fi
	if [ -n "$KB_LAYOUT" ]; then
		set -- --layout "$KB_LAYOUT"
		[ -n "$KB_VARIANT" ] && set -- "$@" --variant "$KB_VARIANT"
		[ -n "$KB_MODEL"   ] && set -- "$@" --model   "$KB_MODEL"
		[ -n "$KB_OPTIONS" ] && set -- "$@" --options "$KB_OPTIONS"
		forge msg keyboard-config "$@" 2>/dev/null || true
	fi

	if command -v grim >/dev/null 2>&1; then
		forge msg bind-key '*' Print grim /tmp/screenshot.png 2>/dev/null || true
		if command -v slurp >/dev/null 2>&1; then
			forge msg bind-key '*' --mods shift Print sh -c 'grim -g "$(slurp)" /tmp/screenshot.png' 2>/dev/null || true
		fi
	fi

	if command -v playerctl >/dev/null 2>&1; then
		forge msg bind-key '*' XF86AudioPlay  playerctl play-pause 2>/dev/null || true
		forge msg bind-key '*' XF86AudioNext  playerctl next       2>/dev/null || true
		forge msg bind-key '*' XF86AudioPrev  playerctl previous   2>/dev/null || true
	fi

	if command -v swayidle >/dev/null 2>&1; then
		swayidle -w \
			timeout 300 'forge msg lock' \
			timeout 600 'forge msg dpms off' \
				resume 'forge msg dpms on' &
	fi
fi

exec /usr/bin/crustace
