#!/bin/sh

. /usr/share/alterator/build/backend3.sh

APT="/usr/bin/apt-get --simple-output"

ERRPIPE="/var/run/alterator-apt/stderr.fifo"
INPIPE="/var/run/alterator-apt/stdin.fifo"

mkdir -p /var/run/alterator-apt/
[ -p "$ERRPIPE" ] || (rm -rf "$ERRPIPE"; mkfifo -m600 "$ERRPIPE")
[ -p "$INPIPE" ] || (rm -rf "$INPIPE"; mkfifo -m600 "$INPIPE")

export LANG=C

#FIXME: how to kill all childs under shell subprocesses
exit_handler()
{
	local rc=$?
	trap - EXIT
	if [ -n "$(jobs)" ]; then
		[ ! -p "$INPIPE" ] || echo "q" >"$INPIPE"
	fi
	rm -f "$ERRPIPE" "$INPIPE"
	exit $rc
}

stdin_handler()
{
	while :; do
		[  -e "$INPIPE" ] || break
		while read n; do

			echo "stdin_handler:$n" >&2
			
			if [ "$n" = "q" ]; then
				rm -f "$INPIPE"
				break 2
			fi

			echo "$n"
		
		done < "$INPIPE"
	done
}

stderr_handler()
{
	while read n; do
		alterator-mailbox-send "error \"$n\""
	done <"$ERRPIPE"
}

stdout_handler()
{
	while read n;do
		alterator-mailbox-send "message \"$n\""
	done
	[ ! -p "$INPIPE" ] || echo "q" >"$INPIPE"
}

trap exit_handler EXIT HUP INT QUIT TERM

run_apt()
{
	local rc=0
	stderr_handler &
	$APT $in_job $in_packages 2>"$ERRPIPE" || rc=$?
	wait
	echo "apt-get:finish:$rc"
}

apt_pipe()
{
	stdin_handler|run_apt|stdout_handler
}

on_message()
{
	case "$in_action" in
		write)
			if [ "$in__objects" = "install" ]; then
				echo "run installation..." $in_packages >&2
				if [ -z "$(jobs)" ]; then
					 apt_pipe &
				fi
			elif [ "$in__objects" = "notify" ]; then
				echo "on_message:notify:$in_message" >&2
				[ ! -p "$INPIPE" ] || echo "$in_message" >"$INPIPE"
			fi
			echo '()'
			;;
		*)
			echo '#f'
	esac
}

message_loop
