#!/bin/bash

usage() {
	echo "Usage:"
	echo "	$0 - [ -c Cloud Name ] [-d User Domain ] [ -f Enable Fips ] [ -h Help] [ -l hideAppUIOnLaunch ] [ -p User password ] [ -r externalRedirect  ] [ -s strictEnforcement ] [ -t policyToken ] [ -T deviceToken ] [ -u username ] [ -w waitForInput ] "
	echo "	$0 - [ No Argument ] For UI based interaction"
	echo "	$0 - [ -c Cloud Name ] [ String Argument ] "
	echo "	$0 - [ -d User Domain ] [ String Argument ] "
	echo "	$0 - [ -f Enable Fips ] [ 0/1 ] "
	echo "	$0 - [ -h Help]"
	echo "	$0 - [ -l Hide App UI on Launch ] [ 0/1 ] "
	echo "	$0 - [ -r External Redirect ] [ 0/1 ] "
	echo "	$0 - [ -s Strict Enforcement] [ 0/1 ] "
	echo "	$0 - [ -S Disable sudo keyword inside the scripts] [ 0/1 ]"
	echo "	$0 - [ -t Policy Token ] [ String Argument ] "
	echo "	$0 - [ -T Device Token ] [ String Argument ] "
	echo "	$0 - [ -u User Name ] [ String Argument ] "
	echo "	$0 - [ -w Wait for Input ] [ 0/1 ] "
}

exit_abnormal() {
	usage
	exit 1
}

checkBolleanValue() {
	value=$1
	if [ $1 -eq 0 -o $1 -eq 1 ]; then
		return
	else
		echo "Error: Invalid Boolean Value !!!"
		usage
		exit 1
	fi
}

restartServices(){
	${disableSudoKeyword} systemctl restart zstunnel
	declare -a allUsers=`users`
	for user in $allUsers
	do
		if [ "$user" != "root" ]; then
			su -l $user -c "XDG_RUNTIME_DIR=/run/user/$(id -u $user) systemctl --user restart ZSTray"
		fi
	done
}

parseCommandLineArguments() {
	while getopts ":s:f:w:l:r:u:d:c:t:T:h" options; do
	case "${options}" in
		s)
			checkBolleanValue ${OPTARG}
			strictEnforcement=1
			;;

		S)
			checkBolleanValue ${OPTARG}
			if [ "${OPTARG}" = "1" ]; then
				disableSudoKeyword=""
			else
				disableSudoKeyword="sudo"
			fi
			;;

		f)
			checkBolleanValue ${OPTARG}
			enableFips=${OPTARG}
			;;

		w)
			checkBolleanValue ${OPTARG}
			if [ "${OPTARG}" = "1" ]; then
				waitForInput="true"
			else
				waitForInput="false"
			fi
			;;

		l)
			checkBolleanValue ${OPTARG}
			hideAppUIOnLaunch=${OPTARG}
			;;

		r)
			checkBolleanValue ${OPTARG}
			if [ "${OPTARG}" = "1" ]; then
				externalRedirect=true
			else
				externalRedirect=false
			fi
			;;

		u)
			userName=${OPTARG}
			;;

		d)
			userDomain=${OPTARG}
			;;

		c)
			cloudName=${OPTARG}
			;;

		t)
			policyToken=${OPTARG}
			;;

		T)
			deviceToken=${OPTARG}
			;;

		h)
			usage
			exit 1
			;;

		:)
			echo "Error: -${OPTARG} requires an argument !!!"
			exit_abnormal
			;;
		*)
			exit_abnormal
			;;
	esac
	done
}

enableFips=0
hideAppUIOnLaunch=0
strictEnforcement=0
externalRedirect="false"
waitForInput="false"
disableSudoKeyword="sudo"
deviceToken=""
cloudName=""
policyToken=""
userName=""
password=""
userDomain=""

if [ $(id -u) -ne 0 ]; then echo "Error: Please run as root !!!" ; exit 1 ; fi

if [ $# -eq 0 ]; then
	#run the zscaler.config script to set the ZCC parameters
	/opt/zscaler/scripts/zscaler.config ${disableSudoKeyword}
	restartServices
	# delete all the cache data from the debconf database
	sed -i '/zscaler/, +100d' /var/cache/debconf/config.dat
	sed -i '/zscaler/, +100d' /var/cache/debconf/templates.dat
else
	parseCommandLineArguments "$@"
	${disableSudoKeyword} echo "hideAppUIOnLaunch=${hideAppUIOnLaunch}&deviceToken=${deviceToken}&wait=${waitForInput}&cloud=${cloudName}&token=${policyToken}&username=${userName}&password=${password}&externalRedirect=${externalRedirect}&strictEnforcement=${strictEnforcement}&userDomain=${userDomain}&fips=${enableFips}&mode=0" > /opt/zscaler/.config.ini
	restartServices
fi
