#!/bin/sh

# WARNING: This script assumes being run inside XDG compliant session,
# which means D-Bus session instance is expected to be correctly set up
# prior to this script starting. If that is not true, things may break!

DATE_FORMAT='+%Y-%m-%dT%H:%M:%S%Z'

for init in dinit openrc runit s6; do
    [[ -f /sbin/$init-init ]] && case $init in
        dinit|openrc)  SUPPORT='' ;;
        runit|s6)      SUPPORT='YES' ;;
    esac && break
done

[ $SUPPORT ] || { echo "Unsupported method; use the service manager (rc-service/dinitctl) to control PipeWire."; exit 1; }

startpw() {
	# The core daemon which by itself does probably nothing.
	echo "[$(date "${DATE_FORMAT}")] Starting PipeWire." 1>>"${ARTIX_PIPEWIRE_LOG}"
	echo -n "Starting PipeWire... "
	/usr/bin/pipewire 1>>"${ARTIX_PIPEWIRE_LOG}" 2>&1 &

	# The so called pipewire-pulse daemon used for PulseAudio compatibility.
	# Commenting this out will stop the PA proxying daemon from starting,
	# however ALSA (with pipewire-alsa), JACK (with jack-sdk) and PW API using
	# clients will still have access to audio and may end up clashing with
	# non-PW apps over HW control (most notably, /usr/bin/pulseaudio daemon).
	echo "[$(date "${DATE_FORMAT}")] Starting PipeWire-Pulse." 1>>"${ARTIX_PIPEWIRE_PULSE_LOG}"
	echo -n "PipeWire-Pulse... "
	/usr/bin/pipewire -c pipewire-pulse.conf 1>>"${ARTIX_PIPEWIRE_PULSE_LOG}" 2>&1 &

	# Hack for bug #822498
	sleep 1

	# Finally a session manager is required for PipeWire to do anything
	echo "[$(date "${DATE_FORMAT}")] Starting WirePlumber." 1>>"${ARTIX_WIREPLUMBER_LOG}"
	echo -n "WirePlumber... "
	/usr/bin/wireplumber 1>>"${ARTIX_WIREPLUMBER_LOG}" 2>&1 &
	echo "done!"
}

restart() {
	echo -n "Terminating PipeWire processes... "
	pkill -9 -u "${USER}" -x "pipewire|wireplumber" 1>/dev/null 2>&1
	pidwait -u "${USER}" -x "pipewire|wireplumber" 2>/dev/null || sleep 1
	echo "terminated."
	startpw
}

CONF="${XDG_CONFIG_HOME}/artix-pipewire-launcher.conf"
if [ -f "${CONF}" ]; then
	. "${CONF}"
else
	ARTIX_PIPEWIRE_LOG='/dev/null'
	ARTIX_PIPEWIRE_PULSE_LOG='/dev/null'
	ARTIX_WIREPLUMBER_LOG='/dev/null'
fi

for L in \
	"${ARTIX_PIPEWIRE_LOG}" \
	"${ARTIX_PIPEWIRE_PULSE_LOG}" \
	"${ARTIX_WIREPLUMBER_LOG}"; do
	if [ ! -e "${L}" ]; then
		touch "${L}"
	fi
done

pwpid=$(pgrep -u "${USER}" -x "pipewire")
wppid=$(pgrep -u "${USER}" -x "wireplumber")
[[ ! -z "$pwpid$wppid" && "${1}" != "restart" ]] &&  { echo "PipeWire/WirePlumber already running."; exit 0; }

[ -z "${1}" ] && startpw

if [ "${#}" -gt 0 ]; then
	if [ "${1}" = 'restart' ]; then
		restart
	else
		echo "Unrecognised argument." >&2
		echo "Usage: artix-pipewire-launcher [restart]" >&2
		exit 1
	fi
fi
