#!/bin/sh -efu

. girar-sh-functions

girar_queue="/var/spool/girar/public"
private_queue="/var/spool/girar/private"
upravdom_queue="/var/spool/build-factory"
upravdom_account="factory"

upravdomlock="$upravdom_queue/.lock"

find_args="-mindepth 1 -maxdepth 1 -regextype posix-basic -regex '^.*/[[:digit:]]\+$' -type f -printf '%f\n'"

findin()
{
	eval find "\$1" $find_args |
		sort -n
}

findin_upravdom_queue()
{
	ssh -n "$upravdom_account" "find '$upravdom_queue' $find_args" |
		sort -n
}

exit_handler()
{
	local rc=$?
	trap - EXIT

	# unlock upravdom queue if and only if we own it
	ssh -n "$upravdom_account" "[ ! -d '$upravdomlock' -o ! -O '$upravdomlock' ] || rmdir -- '$upravdomlock'" ||
		msg_info "$upravdom_account: $upravdomlock: unable to remove lockdir"

	exit $rc
}

enable -f /usr/lib/bash/lockf lockf
builtin lockf -v "$private_queue"
builtin lockf -v "$girar_queue"

private_num="$(findin "$private_queue" |tail -1)"

[ -n "$private_num" ] &&
	private_num=$(($private_num+1)) ||
	private_num=0

# move tasks from public queue to private queue
for name in $(findin "$girar_queue"); do
	task="$girar_queue/$name"

	if [ ! -s "$task" ]; then
		rm -f -- "$task"
		continue
	fi

	if ! mv -- "$task" "$private_queue/$private_num"; then
		msg_info "unable to move '$task' -> '$private_queue/$private_num'"
		continue
	fi

	private_num=$(($private_num+1))
done

trap exit_handler HUP PIPE INT QUIT TERM EXIT

# lock upravdom queue
ssh -n "$upravdom_account" "while ! mkdir -- '$upravdomlock'>/dev/null 2>&1; do sleep 1; done" ||
	fatal "unable to lock upravdom queue"

upravdom_num="$(findin_upravdom_queue |tail -1)"

[ -n "$upravdom_num" ] && 
	upravdom_num=$(($upravdom_num+1)) ||
	upravdom_num=0

# move tasks from private queue to upravdom queue
for name in $(findin "$private_queue"); do
	rsync -tp "$private_queue/$name" "$upravdom_account:$upravdom_queue/$upravdom_num" ||
		fatal "unable to forward task '$private_queue/$name' -> '$upravdom_account:$upravdom_queue/$upravdom_num': rc=$?"
	rm -f -- "$private_queue/$name"
	upravdom_num=$(($upravdom_num+1))
done
