#!/usr/bin/env bash

hostname=$(cat /proc/sys/kernel/hostname)

_systemctl () {
	systemctl --user "${@:2}" "autostart@$1.service"
}

_query_autostart_toml() {
	tomlq -r --arg host "$hostname" \
    '.hosts[$host].groups as $groups | .apps | to_entries[] | select(
        (.value.hosts | contains([$host])) or
        ([.value.group] | inside($groups))
    ) | '"$1" \
    "$XDG_CONFIG_HOME/autostart.toml"
}

_list () {
	_query_autostart_toml '.value.alias // .key'
}

_echo_table () {
	for unit in "$@"
	do
		printf "%s\t%s\t%s\t%s\n" \
			"$unit" \
			"$(_systemctl "$unit" is-enabled)" \
			"$(_systemctl "$unit" is-active)" \
			"$(_get_autostart_cmd "$unit")"
	done
}

_autostart_manage_list () {
	_list
}

_autostart_manage_info () {
	autostart_units=()
	while IFS='' read -r line
	do
		autostart_units+=("$line")
	done < <(_list)

	_echo_table "${autostart_units[@]}" | column -t -s$'\t' --table-columns 'Unit,Enabled?,Active?,Command'
}

_autostart_manage_log () {
	journalctl --user -fu "autostart@$1.service"
}

_autostart_manage_sync () {
	rm "$HOME/.config/systemd/user/autostart.target.wants/"*

	autostart_units=()
	while IFS='' read -r line
	do
		autostart_units+=("$line")
	done < <(_list)

	for unit in "${autostart_units[@]}"
	do
		_systemctl "$unit" add-wants autostart.target
	done
}

_get_autostart_cmd () {
	_query_autostart_toml 'select((.key == "'"$1"'") or (.value.alias == "'"$1"'")) | .value.command'
}

_autostart_manage_exec () {
	cmd=$(_get_autostart_cmd "$1")
	bash -c "$cmd"
}

_autostart_run_graphical () {
	pass x # Try to unlock yubikey asap

	start-audio pipewire
	wait-for-service "network-online.target"

	# Execute only if not already running
	# Don't match keepassxc-proxy
	if ! (pgrep -l keepassxc | grep -v prox) >/dev/null
	then
		if pass x
		then
			(pass keepass | head -n 1 | keepassxc --pw-stdin ~/sync/passwords.kdbx) &
		fi
	fi

	autoinstall graphical
	autostart-manage run

}

_autostart_run_wayland () {
	_autostart_run_graphical

	killall -SIGUSR2 waybar
}

_autostart_run_xorg () {

	feh --bg-fill "$XDG_PICTURES_DIR/wallpaper/active_wallpaper"

	"$HOME/.config/polybar/launch.sh" &
	"$HOME/.config/bspwm/focus-voip.py" &

	numlockx on
	xsetroot -cursor_name left_ptr
	xrdb "$HOME/.Xresources"

	_autostart_run_graphical
}

case $1 in
	list)			_autostart_manage_list ;;
	info)			_autostart_manage_info ;;
	sync)			_autostart_manage_sync ;;
	enable)			_systemctl "$2" add-wants autostart.target ;;
	disable)		_systemctl "$2" disable ;;
	restart)		_systemctl "${2:-*}" restart;;
	log)			_autostart_manage_log "$2";;
	start)			_systemctl "${2:-*}" start;;
	status)			_systemctl "${2:-*}" status ;;
	stop)			_systemctl "${2:-*}" stop ;;
	run)			systemctl --user start autostart.target ;;
	run-xorg)		_autostart_run_xorg ;;
	run-wayland)	_autostart_run_wayland ;;
	exec)			_autostart_manage_exec "$2" ;;
	*)				echo "'$1' is not valid" ;;
esac