#!/bin/sh

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

NTPD_CONF=/etc/ntpd.conf
DATADIR=/usr/share/alterator-datetime/

_()
{
LANG=${in_language%%;*}.utf8 gettext "alterator-datetime" "$1"
}

error() {
	printf '(error "%s")' "$*"
}

read_pool()
{
	sed -n "/^servers[[:space:]]\+/ {s,^servers[[:space:]]\+,,p;q}" "$NTPD_CONF"
}

write_pool()
{
	sed -r "/^servers?[[:space:]]+/ d" -i "$NTPD_CONF"
	echo "$1 $2" >>"$NTPD_CONF"
}

list_pool()
{
	local language="$INSTALLER_LANGUAGE"
	[ -n "$language" ] || language="${in_language%%;*}"

	local region="$(printf %s "$language" |
			sed -r -e 's,[a-z]+_([^\.]+)(\..*)?,\1,' |
			tr '[:upper:]' '[:lower:]')"

	[ -n "$region" ] || region="all"

	local ntp_file="$DATADIR/ntpservers.$region"
	[ -s "$ntp_file" ] || ntp_file="$DATADIR/ntpservers.all"

	local IFS='	'
	while read name server;do
	    printf '("%s" label "%s (%s)")' "$server" "$name" "$server"
	done<"$ntp_file"
}

read_runlevel()
{
    sed -nr '/:initdefault:$/ {s,^id:([^:]+):.*,\1,;p}' /etc/inittab
}


on_message()
{
	case "$in_action" in
		constraints)
			echo '('
			printf 'has_ntp (default #f exclude (#f use_ntp) exclude (#f pool))'
			printf 'use_ntp (label "%s" default #f exclude (#f pool) exclude (#t date) exclude (#t time))' \
			    "`_ "Setup automatically:"`"

			printf 'date (label "%s")' "`_ "Date"`"
			printf 'time (label "%s")' "`_ "Time"`"
			echo ')'
			;;
		list)
			echo '('
			[ "$in__objects" = "avail_pool" ] && list_pool
			echo ')'
			;;
	    	read)
			echo '('
		
			date +'date "%F"'
			date +'time "%T"'

			
			printf 'has_ntp %s\n' "$([ -f /etc/rc.d/init.d/ntpd ] && echo "#t" || echo "#f")"
			printf 'pool "%s"\n' "$(read_pool)"

			local runlevel=$(read_runlevel)
			if LANG=C chkconfig --list ntpd|fgrep -qsw "$runlevel:on";then
				printf 'use_ntp #t\n'
			else
				printf 'use_ntp #f\n'
			fi

			echo ')'
			;;
		write)
			if  [ -n "$in_date" -a -n "$in_time" ] &&
			    ! err="$(LANG=${in_language%%;*}.utf8 date --set="$in_date $in_time" +'%F %T' 2>&1 >/dev/null)"; then
				error "$err"
				return
			fi

			type

			[ -n "$in_pool" ] && write_pool "servers" "$in_pool"
			[ -n "$in_server" ] && write_pool "server" "$in_server"

			if [ "$in_use_ntp" = "#t" ]; then
				chkconfig ntpd on
				service ntpd start >/dev/null 2>/dev/null
			else
				chkconfig ntpd off
				service ntpd condstop >/dev/null 2>/dev/null
			fi

			service clock sync >/dev/null 2>/dev/null

			echo '()'
			;;
		*)
			echo '#f'
			;;
	esac
}

message_loop
