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

CHECK_ENVIRONMENT
#####################################################################

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() {
	STATUS "starting '$@'"
	for SERVER in ${WRYN__SERVER_HOSTNAMES[@]}; do UPDATE $SERVER "$@"; done
	WAIT_FOR_UPDATES \
		&& 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;}' \
)

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

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
REMINDER
REMINDER 'manual action is required; (in another tab) connect to tmux:'
REMINDER "tmux a -t $SESSION"
REMINDER
REMINDER 'to stop the update at any time, run:'
REMINDER "tmux kill-session -t $SESSION"
REMINDER

[ $CURRENT_SESSION ] && {
	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'"

SUCCESS
SUCCESS 'finished system update accross all servers'
SUCCESS

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