#!/usr/bin/env bash

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

_dasel () {
	dasel -f "$HOME/.config/autostart.toml" -r toml "${@}"
}

_list () {
	part_root='all().filter(not(equal(type(),object))).key()'
	part_host='all().filter(equal(type(),object)).all().key()'
	arg="merge($part_host,$part_root).all()"
	_dasel "$arg" \
		| sort \
		| uniq
	#systemctl --user list-unit-files \
	#	| grep "autostart-" \
	#	| awk '{print $1}' \
	#	| sed -e 's/^autostart-//' -e 's/.service$//'
}

_echo_table () {
	for unit in "$@"
	do
		printf "%s\t%s\t%s\n" \
			"$unit" \
			"$(_systemctl "$unit" is-enabled)" \
			"$(_systemctl "$unit" is-active)"
	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?'
}

_autostart_manage_enable_all () {
	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 () {
	hostname=$(cat /proc/sys/kernel/hostname)

	selector_base="all()"
	selector_host="all().filter(equal(type(),object)).filter(equal(key(),$hostname)).all()"
	selector_entry="filter(not(equal(type(),object))).filter(equal(key(),$1))"
	cmd=$(_dasel "$selector_base.$selector_entry")
	cmd_local=$(_dasel "$selector_host.$selector_entry")

	if [ -n "$cmd_local" ]; then
		if [ "$cmd_local" = "false" ]; then
			cmd=""
		else
			cmd="$cmd_local"
		fi
	fi
	echo "$cmd"
}

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

_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"

	#pkill sxhkd; sxhkd &
	#pgrep -x xcompmgr > /dev/null || xcompmgr -cnfFn -D3 &


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

	if ! pgrep -x keepassxc
	then
		pass x
		(pass keepass | head -n 1 | keepassxc --pw-stdin ~/sync/passwords.kdbx) &
	fi

	autoinstall graphical
	autostart-manage run
}

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