#!/bin/sh

set -eu

. /usr/share/geordi/_functions
. /etc/geordi/scripts-config

trap 'cd "$(pwd)"' EXIT

RT=${RT:-"/var/run/geordi/rt"}
CONFIG_DIR="${CONFIG_DIR:-/etc/geordi}"
AUTO_RECONNECT="${AUTO_RECONNECT:-0}"
ALWAYS_REFRESH_CHROOT="${ALWAYS_REFRESH_CHROOT:-1}"
DEBUG=${DEBUG:-0}
INFO=${INFO:-1}

SIMPLE_RECONNECT=0

cd "${CONFIG_DIR}"

cond_refresh() {
	if [ ${SIMPLE_RECONNECT} -eq 1 ];
	then
		SIMPLE_RECONNECT=0
		return
	fi

	case "$(echo "${ALWAYS_REFRESH_CHROOT}" | tr A-Z a-z)" in
		yes|true|on|y|1)
			info "Refreshing chroot."
			info "Tip: to avoid refreshing every time, edit ALWAYS_REFRESH_CHROOT in /etc/geordi/scripts-config."
			/usr/sbin/geordi-refresh-chroot || exit $?
			;;
	esac
}

connect() {
	cond_refresh

	debug "Starting geordi"

	if [ ! -d "${RT}" ];
	then
		error "${RT} does not exist - run /usr/sbin/geordi-refresh-chroot"
	fi

	/usr/lib/geordi/geordi-irc -c "${CONFIG_DIR}/irc-config"
	STATUS=$?
	debug "Geordi exited with exit status ${STATUS}"
	
	return ${STATUS}
}

TIMEOUT=5
MAX_TIMEOUT=120
auto_reconnect() {
	while true;
	do
		connect || STATUS=$?

		debug "Auto-reconnecting Geordi exited with exit status ${STATUS}"

		case ${STATUS} in
			252)
				info "Auto-reconnection cancelled."
				exit ${STATUS}
				;;
			143)
				info "Geordi killed - reconnecting."
				TIMEOUT=0
				cond_refresh
				;;
			*)
				# Don't refresh chroot when simply reconnecting
				SIMPLE_RECONNECT=1
				;;
		esac

		if [ ${TIMEOUT} -gt ${MAX_TIMEOUT} ];
		then
			TIMEOUT=${MAX_TIMEOUT}
		fi

		info "Waiting for ${TIMEOUT} seconds before reconnecting"
		sleep ${TIMEOUT}

		TIMEOUT=$((${TIMEOUT} * 2))
	done
}

case "$(echo "${AUTO_RECONNECT}" | tr A-Z a-z)" in
	yes|true|on|y|1)
		auto_reconnect
		;;
	*)
		connect
		;;
esac
