#!/bin/sh

if [ -z "$XDG_RUNTIME_DIR" ] ; then
	echo "Foxclient requires an XDG_RUNTIME_DIR!" >&2
	exit 1
fi

FOXCLIENT_PROFILE="${FOXCLIENT_PROFILE:-/usr/share/foxclient-default-profile}"
FOXCLIENT_RUNTIME_DIR="${FOXCLIENT_RUNTIME_DIR:-$XDG_RUNTIME_DIR/foxclient}"
FOXCLIENT_PIDFILE="$FOXCLIENT_RUNTIME_DIR/runsvdir.pid"

FOXCLIENT_SV="$FOXCLIENT_RUNTIME_DIR/sv"
export SVDIR="$FOXCLIENT_SV"

if ! [ -d "$FOXCLIENT_PROFILE" ] ; then
	echo "No foxclient profile active" >&2
	exit 1
fi

run_desktop() {
	mkdir -p "$FOXCLIENT_RUNTIME_DIR"
	trap stop_running term
	trap stop_running int
	flock -x --nonblock -E 123 -- "$FOXCLIENT_RUNTIME_DIR" "$0" run-desktop-inner
	EXIT_CODE="$?"
	case "$EXIT_CODE" in
		123)
			echo "Foxclient is already running!" >&2
			;;
		*)
			;;
	esac
	exit $EXIT_CODE
}

run_desktop_inner() {
	mkdir -p "$FOXCLIENT_SV"
	rsync --delete -r "$FOXCLIENT_PROFILE/sv/" "$FOXCLIENT_SV/"
	runsvdir "$FOXCLIENT_SV" &
	RUNSVDIR_PID="$!"
	trap stop_running term
	trap stop_running int
	trap cleanup_pidfile EXIT
	echo "$RUNSVDIR_PID" > "$FOXCLIENT_PIDFILE"
	wait "$RUNSVDIR_PID"
}

stop_running() {
	PID="$(head -n 1 "$FOXCLIENT_PIDFILE")"
	kill -s HUP "$PID"
}

cleanup_pidfile() {
	if [ -f "$FOXCLIENT_PIDFILE" ] ; then
		rm "$FOXCLIENT_PIDFILE"
	fi
}

SUBCOMMAND="$1"
case "$SUBCOMMAND" in
	run-desktop)
		run_desktop
		;;
	run-desktop-inner)
		run_desktop_inner
		;;
	start|restart|stop|status)
		if ! printf "%s" "$2" | grep -qE '^[A-Za-z0-9_-]+$' ; then
			echo "Invalid service name, must match [A-Za-z0-9_-]+ ." >&2
			exit 1
		fi
		exec sv "$@"
		;;
	exit)
		stop_running
		;;
	hook)
		HOOK="$2"
		shift 1
		if ! printf "%s" "$HOOK" | grep -qE '^[A-Za-z0-9_-]+$' ; then
			echo "Invalid hook name, must match [A-Za-z0-9_-]+ ." >&2
			exit 1
		fi
		if ! [ -d "$FOXCLIENT_PROFILE/hooks/$HOOK" ] ; then
			echo "No hooks registred as '$HOOK'"
		fi
		for script in "$FOXCLIENT_PROFILE/hooks/$HOOK"/* ; do
			"$script" "$@"
		done
		;;
	ls-sv)
		ls "$FOXCLIENT_SV"
		;;
	ls-hook)
		ls "$FOXCLIENT_PROFILE/hooks"
		;;
esac
