#!/bin/sh

usage ()
{
	echo "Usage: $(basename ${0}) mode [arguments]"
	[ $# -gt 0 ] && exit 2
	exit
}

has_setting ()
{
	grep -q "^${1}=" ${RCFILE} && return 0
	return 1
}

get_setting ()
{
	local setting=${1}
	if ! has_setting ${setting}
	then
		echo "${setting} not found" >&2
		return 1
	fi

	value=$(grep "^${setting}=" ${RCFILE} \
		| awk -F'=' '{print $2}' \
		| sed "s/^\([\"']\)\(.*\)\1\$/\2/g")
	echo ${value}
}

set_setting ()
{
	local setting=${1}
	local value=${2}

	# escape value
	value=$(echo ${value} | sed 's/"/\\"/')

	if has_setting ${setting}
	then
		# replace setting
		sed -i '' "s/^${setting}=.*/${setting}=\"${value}\"/" ${RCFILE}
	else
		# append setting
		echo ${setting}=\"${value}\" >> ${RCFILE}
	fi
}

# mode execution
do_set ()
{
	local setting=${1}
	local value=${2}

	set_setting ${setting} ${value}
}

do_get ()
{
	local setting=${1}

	get_setting ${setting}
}

do_delete ()
{
	local setting=${1}

	if ! has_setting ${setting}
	then
		echo "${setting} not found" >&2
		return 1
	fi

	sed -i '' "/^${setting}=/d" ${RCFILE}
}

do_enable ()
{
	local service=${1}

	# normalize input
	if ! echo ${service} | grep -q '_enable$'
	then
		service="${service}_enable"
	fi

	set_setting ${service} YES
}

do_disable ()
{
	local service=${1}

	# normalize input
	if ! echo ${service} | grep -q '_enable$'
	then
		service="${service}_enable"
	fi

	set_setting ${service} NO
}

do_list ()
{
	grep -E '^[a-zA-Z]+' ${RCFILE} | sort
}

# default values
RCFILE=${RCFILE:="/etc/rc.conf"}

# detect modes & arguments
if [ $# -lt 1 ]
then
	usage 1
fi

case $1 in
	help)
		usage
		;;
	list|ls)
		MODE="list"
		ARGC=0
		;;
	get)
		MODE=$1
		ARGC=1
		;;
	delete|del|remove|rm)
		MODE="delete"
		ARGC=1
		;;
	set)
		MODE=$1
		ARGC=2
		;;
	enable|en)
		MODE="enable"
		ARGC=1
		;;
	disable|dis)
		MODE="disable"
		ARGC=1
		;;
	*)
		usage 1
		;;
esac

# check amount of args
if [ $# -lt ${ARGC} ]
then
	echo "not enough arguments for mode: ${MODE}" >&2
	exit 1
fi

# perform actual action
shift
do_${MODE} "${@}"
