#!/bin/bash

function configure_init
{
# add_option(cmake varaible name, configure script name, description, [value to assign])
add_option "BUILD_qtrpc2_STATIC" "qtrcp2-static" "Build qtrpc2 statically" "ON"
add_option "BUILD_rdsclient_STATIC" "rdsclient-static" "Build rdsclient statically" "ON"
add_option "BUILD_rdsldap_STATIC" "rdsldap-static" "Build rdsldap statically" "ON"
add_option "BUILD_rdsserver_STATIC" "rdsserver-static" "Build rdsserver statically" "ON"
add_option "CMAKE_BUILD_TYPE" "build-type" "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel"
add_option "CMAKE_BUILD_TYPE" "debug" "Build project with debug symbols" "Debug"
add_option "CMAKE_BUILD_TYPE" "release" "Build project without debug symbols" "Release"
add_option "CMAKE_BUILD_DIR" "build-dir" "Directory in which to build. \"make\" must be run from this path"
add_option "CMAKE_INSTALL_PREFIX" "prefix" "Install path prefix, prepended onto install directories"
add_option "RDS_PREFIX" "rds-prefix" "Prefix to compile into RDS, this should point to the same spot as --prefix"
add_option "DNS_DEFAULT_FILE" "samba-dns-config" "Samba's DNS config"
add_option "LDAP_URI:STRING" "ldap-uri" "Uri used for connecting to LDAP"
add_option "QT_QMAKE_EXECUTABLE" "qmake" "Path to qmake"
add_option "RDS_DHCP_CONFIGFILE" "dhcpd-config" "DHCPD config file"
add_option "RDS_DNS_CONFIGDIR" "dns-config" "Bind9 config directory"
add_option "RDS_DNS_CONFIGDIR_BACKUP" "dns-backup" "Backup directory for bind9 writing"
add_option "RDS_DNS_ZONEDIR" "dns-zones" "Bind9 zones path"
add_option "RDS_HOSTNAME" "hostname-config" "Hostname file"
add_option "RDS_HOSTS" "hosts-config" "Hosts file"
add_option "RDS_INITD_BIND" "dns-init" "Bind9 init script"
add_option "RDS_INITD_DHCP" "dhcpd-init" "DHCPD init script"
add_option "RDS_INITD_SAMBA4" "samba-init" "Samba Init script"
add_option "RDS_KRB5" "krb5-config" "krb5 conf file"
add_option "RDS_LOGFILE" "rds-log" "RDS logfile"
add_option "RDS_NETWORK_INTERFACES" "interfaces-config" "Interfaces file"
add_option "RDS_SAMBA_CONFIGFILE" "samba-config" "Samba config file"
add_option "RDS_SAMBA_PATH" "samba-prefix" "Samba Path"
add_option "RDS_SAMBA_UTIL_PATH" "samba-util-path" "Samba Utility path"
add_option "RDS_SAMBA_SYSVOL" "samba-sysvol" "Samba Sysvol Path"
add_option "RDS_SAMBA_RUN" "samba-run" "Samba Run Path"
add_option "RDS_SAMBA_PRIVATE" "samba-private" "Directory where the samba configuration is kept"
add_option "RDS_SAMBA_PROVISION" "samba-provision" "Path to the Samba provision script"
add_option "RDS_TIMEZONE" "timezone-config" "Timezone file"
add_option "RDS_TIMEZONE_FOLDER" "timezone-template-path" "Timezone template path"
add_option "SAMBA_NET_PATH" "samba-net" "Samba net path"
add_option "RDS_CONF_PATH" "rds-conf-path" "Config file path"
add_option "RDS_DATA_PATH" "rds-data-path" "Path for RDS data files"
}

function add_option
{
	#cmake isn't case sensitive, but i like them in all caps...
	CMAKE_VAL=`echo $1 | tr '[a-z]' '[A-Z]'`
	#command options should always be lower case
	CONFIG_VAL=`echo $2 | tr '[A-Z]' '[a-z]'`
	DESC_VAL=$3
	VALUE_VAL=$4

	NICE_NAME=`echo $CONFIG_VAL | sed 's/-/_/g'`
	eval export ${NICE_NAME}_CMAKE="\"$CMAKE_VAL\""
	eval export ${NICE_NAME}_CONFIG="\"$CONFIG_VAL\""
	eval export ${NICE_NAME}_DESC="\"$DESC_VAL\""
	eval export ${NICE_NAME}_VALUE="\"$VALUE_VAL\""

	export COMMAND_LIST="${COMMAND_LIST} ${CONFIG_VAL}"
	
	[ "$MAX_LENGTH" == "" ] && export MAX_LENGTH=0
	CUR_LENGTH=`echo $CONFIG_VAL | wc -c`
	
	if [ "$CUR_LENGTH" -gt "$MAX_LENGTH" ]
	then
		export MAX_LENGTH="$CUR_LENGTH"
	fi
}

function show_usage
{
	echo "Available options:"
	for cmd in ${COMMAND_LIST}
	do
		echo -n "  --$cmd"
		TMP_LENGTH=`echo $cmd | wc -c`
		while [ "$TMP_LENGTH" -lt "$MAX_LENGTH" ]
		do
			let "TMP_LENGTH = $TMP_LENGTH + 1"
			echo -n " "
		done
		echo -n "        "
		get_desc $cmd
		echo
	done
	echo
}

function get_cmake
{
	[ "$1" == "" ] && return 1
	cmd=`echo $1 | sed 's/-/_/g'`

	eval echo -n "\$${cmd}_CMAKE"
}

function get_desc
{
	[ "$1" == "" ] && return 1
	cmd=`echo $1 | sed 's/-/_/g'`

	eval echo -n "\$${cmd}_DESC"
}

function get_value
{
	[ "$1" == "" ] && return 1
	cmd=`echo $1 | sed 's/-/_/g'`

	eval echo -n "\$${cmd}_VALUE"
}

function get_getop_arg
{
	for cmd in ${COMMAND_LIST}
	do
		echo -n $cmd
		[ "`get_value $cmd`" == "" ] && echo -n ":"
		echo -n ","
	done
}

cmake_pwd=$PWD
PROGNAME=`basename "$0"` # strip of path
PROGDIR=`dirname "$0"`

if [ "$PROGDIR" = "." ]
then
        PROG=`which "$PROGNAME"`
        PROGDIR=`dirname "$PROG"`
fi
if [ "${PROGDIR:0:1}" != "/" ]
then
        PROGDIR="${PWD}/${PROGDIR}"
fi
PROGDIR=`cd $PROGDIR; pwd`
cd $PROGDIR

if [ "$cmake_pwd" != "$PROGDIR" ]
then
	RDS_CMAKE_BUILD_DIR="$cmake_pwd"
fi

cmake_pwd="$PROGDIR"

configure_init
possible_args=`get_getop_arg`

args=`getopt -l "${possible_args}help" --name "configure" "h" "$@"`
if [ "$?" != "0" ]
then
	show_usage
	exit 1
fi

eval set -- $args

while [ ! -z "$1" ]
do
	[ "$1" == "--" ] && break
	if [ "$1" == "--help" ] || [ "$1" == "-h" ]
	then
		show_usage
		exit 0
	fi

	cmd=`echo $1 | sed 's/^--//'`

	if [ "`get_desc $cmd`" == "" ]
	then
		show_usage
		echo "configure: Unkown option, $1"
		exit 1
	fi

	VALUE_TO_SET=`get_cmake $cmd`

	if [ "$VALUE_TO_SET" == "CMAKE_BUILD_DIR" ]
	then
		RDS_CMAKE_BUILD_DIR=$2
		shift
		shift
		continue
	fi

	if [ "`get_value $cmd`" == "" ]
	then
		cmake_args="$cmake_args -D ${VALUE_TO_SET}=$2"
		shift
	else
		cmake_args="$cmake_args -D ${VALUE_TO_SET}=`get_value $cmd`"
	fi
	shift
done

echo "Running: cmake $cmake_args $cmake_pwd"

[ "$RDS_CMAKE_BUILD_DIR" != "" ] && mkdir -p ${RDS_CMAKE_BUILD_DIR} && cd ${RDS_CMAKE_BUILD_DIR}

cmake $cmake_args $cmake_pwd
