#!/bin/zsh
DEPENDENCIES+=(hostnamectl)
REQUIRED_ENV+=(WRYN__SERVER_HOSTNAMES)
#####################################################################

SESSION='update'
LOCAL_HOST="$(hostnamectl --static)"

UPDATE_REMINDER="{ echo \\UPDATE : an error occured - you may want to stop execution of 'update-all-servers' on $LOCAL_HOST\\\"; read; }"

CHECK_SESSION() {
	tmux list-sessions >/dev/null 2>&1 \
		| grep -q "^$SESSION" && return 0 || return 1
}

UPDATE_ALL() {
	echo.status "starting '$@'"
	for SERVER in ${WRYN__SERVER_HOSTNAMES[@]}; do UPDATE $SERVER "$@"; done
	WAIT_FOR_UPDATES \
		&& echo.success "'$@' finished across all servers" \
		|| FAIL 69 'user abort' \
		;
}

UPDATE() {
	local SERVER_HOST="$1"
	local COMMAND="${@:2} || $UPDATE_REMINDER"
	[[ $2 =~ ^reboot ]] && [[ $SERVER_HOST =~ $LOCAL_HOST ]] && return 0

	[[ $SERVER_HOST =~ $LOCAL_HOST ]] || {
		COMMAND="ssh -t $SERVER_HOST.local 'source ~/.zshrc >/dev/null 2>&1; $COMMAND'"
	}

	tmux new-window -t $SESSION -n $SERVER_HOST "source ~/.zshrc >/dev/null 2>&1; $COMMAND"
}

WAIT_FOR_UPDATES() {
	while [[ $(tmux list-windows -t $SESSION 2>/dev/null | wc -l) -gt 1 ]]
	do
		sleep 1
	done

	CHECK_SESSION
}

#####################################################################


CURRENT_SESSION=$(\
	tmux list-panes -a -F '#{pane_tty} #{session_name}' \
		| grep $(tty) \
		| awk '{print $2;}' \
)

#####################################################################

MAIN() {
	CHECK_SESSION && FAIL 1 'update currently in progress'

	tmux new -d -s $SESSION "echo 'updating all systems'; echo '(leave this window open)'; while true; do sleep 30; done"

	yN 'after update, do you want to reboot all machines?' && REBOOT=1 || REBOOT=0
	echo.reminder "
		manual action is required; (in another tab) connect to tmux:
		tmux a -t $SESSION

		to stop the update at any time, run:
		tmux kill-session -t $SESSION
		 "

	[ $CURRENT_SESSION ] && {
		echo.success 'currently in a tmux session; opening new window...'
		tmux new-window -t $CURRENT_SESSION "unset TMUX; tmux a -t $SESSION"
	}

	UPDATE_ALL 'yay -Syu'
	UPDATE_ALL 'cd ~/.wryn; git pull --autostash'
	UPDATE_ALL '~/.wryn/bin/scwrypts config update'
	UPDATE_ALL '~/.wryn/bin/scwrypts media push'
	UPDATE_ALL '~/.wryn/bin/scwrypts media pull'
	UPDATE_ALL 'command -v i3-msg >/dev/null 2>&1 || exit 0; ~/.wryn/bin/scwrypts i3 font override'

	[[ $REBOOT -eq 1 ]] && UPDATE_ALL 'reboot || sudo reboot'

	tmux kill-session -t $SESSION >/dev/null 2>&1
	CHECK_SESSION && WARNING "unable to close tmux session '$SESSION'"

	echo.success " \nfinished system update accross all servers\n "

	[[ $REBOOT -eq 1 ]] && { echo.status 'rebooting host machine'; sleep 3; reboot || sudo reboot; }
}
