#!/usr/bin/env zsh
#
# works as a standalone zsh script
#

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

CONNECTIONS_FILE="$HOME/.config/wryn/remote-connections.toml"

OMNI_LOGDIR="$HOME/.local/share/scwrypts/dotwryn"
OMNI_LOGFILE="$HOME/.local/share/scwrypts/dotwryn/omni.current.txt"

[ ! -d "$OMNI_LOGDIR" ] && mkdir -p "$OMNI_LOGDIR"

[ -f "$OMNI_LOGFILE" ] && {
	for x in {1..99}
	do
		[ ! -f "$OMNI_LOGDIR/omni.$x.txt" ] && break
	done

	[ ! -f "$OMNI_LOGDIR/omni.$x.txt" ] && mv "$OMNI_LOGFILE" "$OMNI_LOGDIR/omni.$x.txt"
}

echo "OMNI MANAGER START : $(date)" > "$OMNI_LOGFILE"

OMNI_SOCKET="omni.socket"
OMNI_TMUX() { tmux -L $OMNI_SOCKET $@; }

CONFIG_QUERY() { yq -oy -r $@ "$CONNECTIONS_FILE" | grep -v ^null$; }

CONNECTED() {
	[ $WINDOW_ID ] \
		&& echo "\\033[1;32mconnected (window $WINDOW_ID)\\033[0m" >&2 \
		|| echo "\\033[1;32mconnected\\033[0m" >&2 \
}
DISCONNECTED() { echo "\\033[1;31mdisconnected\\033[0m" >&2; }

GET_UNIQUE_WINDOW_ID() {
	local MODE=use-default

	local WINDOW_ID="$(eval "echo \$WINDOW_ID__$REMOTE_NAME")"
	: \
		&& [[ $(eval "echo \$CAN_CONNECT__$REMOTE_NAME") =~ true ]] \
		&& [ $WINDOW_ID ] \
		&& echo $WINDOW_ID \
		&& return 0 \
		;

	unset WINDOW_ID__$REMOTE_NAME &>>"$OMNI_LOGFILE"

	WINDOW_ID="$1"
	WINDOW_ID=$(CONFIG_QUERY .sessions.$REMOTE_NAME.id)
	[ $WINDOW_ID ] && MODE=specify-preferred

	WINDOW_ID_IS_TAKEN() {
		: \
			&& [[   $(OMNI_TMUX list-windows -t=omni | grep "^$WINDOW_ID:" | wc -l) -gt 0 ]] \
			&& [[ ! $(OMNI_TMUX list-windows -t=omni | grep "^$WINDOW_ID:" | awk '{print $2;}' =~ ^$REMOTE_NAME$) ]] \
			;
	}

	local FALLBACK_STARTING_POINT
	case $MODE in
		use-default       ) FALLBACK_STARTING_POINT=42 ;;
		specify-preferred ) FALLBACK_STARTING_POINT=69 ;;
	esac

	local I=0
	while WINDOW_ID_IS_TAKEN
	do
		echo "$REMOTE_NAME tried to acquire window id $WINDOW_ID, but it is already in-use (trying $(($FALLBACK_STARTING_POINT-$I)))" >&2
		WINDOW_ID=$(($FALLBACK_STARTING_POINT-$I))
		((I+=1))
		[[ $I -gt 10 ]] && WINDOW_ID= && break
	done

	echo $WINDOW_ID
}

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

sleep 1
OMNI_TMUX new-window -t=omni-manager -dn 'harakiri' "
while true
do
	tmux -L $OMNI_SOCKET list-sessions | grep -v omni-manager | grep -qi omni || {
		tmux -L $OMNI_SOCKET kill-session -t omni-manager
	}
	sleep 5
done
"

while true
do
	clear
	for REMOTE_NAME in $(CONFIG_QUERY '.sessions | keys | .[]')
	do
		WINDOW_ID=$(GET_UNIQUE_WINDOW_ID)
		export WINDOW_ID__$REMOTE_NAME=$WINDOW_ID

		OMNI_TMUX list-windows -t=omni | awk '{print $2;}' | grep -q $REMOTE_NAME \
			&& continue

		printf "testing connection $REMOTE_NAME..."
		echo "testing connection $REMOTE_NAME..." &>>"$OMNI_LOGFILE"
		scwrypts --name test --group remote --type zsh \
				-- \
				--name $REMOTE_NAME \
				--command 'command -v tmux' \
				&>>"$OMNI_LOGFILE" \
			&& export CAN_CONNECT__$REMOTE_NAME=true \
			|| export CAN_CONNECT__$REMOTE_NAME=false \
			;

		[[ $(eval echo "\$CAN_CONNECT__$REMOTE_NAME") =~ true ]] \
			&&   echo " \\033[1;32m✔\\033[0m" >&2 \
			|| { echo " \\033[1;31m✖\\033[0m" >&2; continue; }

		OMNI_TMUX new-window \
			-t=omni:$WINDOW_ID \
			-dn $REMOTE_NAME "
				source ~/.zshrc &>/dev/null
				TMUX='' scwrypts -n connect/$REMOTE_NAME -- --type tmux
				echo 'connection closed'
				sleep 2
			"

		OMNI_TMUX list-window -t=omni | awk '{print $1;}' | grep -q '99:' && OMNI_TMUX kill-window -t omni:99

		OMNI_TMUX list-windows -t=omni | awk '{print $2;}' | grep -q $REMOTE_NAME \
			|| export CAN_CONNECT__$REMOTE_NAME=false
	done

	clear
	echo "connections:\n"
	local STATUS
	{
		for REMOTE_NAME in $(CONFIG_QUERY '.sessions | keys | .[]')
		do
			[[ $(eval "echo \$CAN_CONNECT__$REMOTE_NAME") =~ true ]] \
				&& echo "${REMOTE_NAME}^$(eval "echo \$WINDOW_ID__$REMOTE_NAME")^\\033[1;32mconnected\\033[0m" \
				|| echo "${REMOTE_NAME}^-^\\033[1;31mdisconnected\\033[0m" \
				;
		done
	} | column -ts '^'
	echo "\nPress ENTER to search again now (checks every 60 seconds)" >&2
	read -t 60
done