#!/usr/local/bin/cbsd
#v11.0.14
MYARG=""
MYOPTARG="formfile bootstrap module jname updcol header inter table out index group"
MYDESC="Ncurses-based jail image boostrap helper"
ADDHELP="updcol = new (default) update new column, cur - update cur column\n\
table - initial table, default is forms\n\
if jname name is cbsdpuppet1 then just generate manifest or hiera\n\
if jname name is CBSDSYS then configure current system\n\
out - out manifest content to file, when jname=cbsdpuppet1\n\
index - index id for group_add and group_del operation\n\
group - group=add or group=del to add/del custom params group, in dynamical forms\n"
EXTHELP="wf_forms.html"

. ${subr}
. ${tools}
. ${strings}
. ${system}

if [ "${1}" != "--help" -a "${1}" != "--args" ]; then
	# assume that this is the path to form when path geing with slash
	prefix=$( substr --pos=0 --len=1 --str=${1} )
	if [ "${prefix}" = "/" ]; then
		formfile="${1}"
		[ ! -f "${1}" ] && err 1 "${MAGENTA}No such form file: ${GREEN}${formfile}${NORMAL}"
		shift
		param=$( cbsdsql ${formfile} SELECT param FROM forms ORDER BY CAST\(order_id AS int\) | /usr/bin/xargs )
		MYOPTARG="${MYOPTARG} ${param}"
	fi
fi

init $*

. ${settingstui}
. ${dialog}

[ -z "${table}" ] && table="forms"

if [ -n "${header}" ]; then
	shift
else
	header=1
fi

readconf helpers.conf
. ${workdir}/imghelper.subr

dialog_menu_main()
{
	local _par VAL
	local btitle="$DIALOG_BACKTITLE"
	local prompt="Use menu for select and edit limit"
	local hline=
	local defaultitem=
	local mytargets=

	f_dialog_default_fetch defaultitem

	[ -n "${jname}" ] && mytargets="for ${jname} "

	local title
	local _mydesc
	local menu_list=
	local _id=0

	if [ -n "${forms_title}" ]; then
		title="${forms_title}"
	else
		title=" Image parameters ${mytargets}"
	fi

	for _items in ${param}; do

		_id=$(( _id + 1 ))

		unset VAL _type
		is_value=0
		is_delimer=0

		if [ "${_items}" = "-" ]; then
			_type="delimer"
		else
			eval _type="\$${_items}_type"
		fi

		case "${_type}" in
			subtable)
				VAL=">>"
				;;
			hiddendelim)
				continue
				;;
			delimer)
				_items="forms_delimer_${_id}"
				is_delimer=1
				;;
			*)
				eval VAL=\$${_items}
				is_value=1
				;;
		esac

		eval _mydesc="\$${_items}_desc"

		if [ ${is_delimer} -eq 1 ]; then
			menu_list="${menu_list} '-'	'${_mydesc}'	'Field delimer'"
		elif [ -z "${VAL}" ]; then
			menu_list="${menu_list} '${_items}'	' '	'${_mydesc}'"
		else
			menu_list="${menu_list} '${_items}'	'${VAL}'	'${_mydesc}'"
		fi

	done

	menu_list="${menu_list} 'COMMIT'	'Save changes and quit'	'Save!'"

	cbsd_menubox
	retval=$?

	f_dialog_data_sanitize menu_choice
	f_dialog_menutag_store "$menu_choice"
	f_dialog_default_store "$menu_choice"

	return $retval
}


# $1 table
get_radio()
{
	local param
	local table="${1}"

	[ -z "${table}" ] && return 1

	param_list=$( cbsdsql ${formfile} SELECT text FROM ${table} ORDER BY CAST\(order_id AS int\)| /usr/bin/xargs )
	local menu_list=
	local x=0
	local _par VAL
	local btitle="$DIALOG_BACKTITLE"
	local prompt="Use menu for select"
	local hline=
	local defaultitem
	defaultitem="yes"

	local title=" syslog "
	local _mydesc

	local menu_list=
	for item in ${param_list}; do
		eval _mydesc="\$${helper}_desc"
		menu_list="${menu_list} '${item}'      '${item}'     '${_mydesc}'"
	done

	cbsd_menubox
	retval=$?

	mtag=$( cbsdsql ${formfile} SELECT text FROM ${table} WHERE text=\"${menu_choice}\" )

	f_dialog_data_sanitize menu_choice

	return $retval
}


# $1 table
get_checkbox()
{
	local param
	local table="${1}"

	[ -z "${table}" ] && return 1

	param_list=$( cbsdsql ${formfile} SELECT text FROM ${table} ORDER BY CAST\(order_id AS int\)| /usr/bin/xargs )
	local menu_list=
	local x=0
	local _par VAL
	local btitle="$DIALOG_BACKTITLE"
	local prompt="Use menu for select"
	local hline=
	local defaultitem

	local title=" syslog "
	local _mydesc

	local menu_list=

	while [ 1 ]; do

		menu_list=

		for i in ${param_list}; do
			eval _mytest=\$$i
			if [ "${_mytest}" = "1" ]; then
				export ${i}_mark="X"
			else
				export ${i}_mark=" "
			fi
		done

		for item in ${param_list}; do
			eval _mydesc="\$${helper}_desc"
			eval _mytest=\$${item}_mark
			[ -z "${_mytest}" ] && _mytest=" "
			menu_list="${menu_list} '${item}'      '[${_mytest}]'     '${_mydesc}'"
		done

		menu_list="${menu_list} 'SELECT'      ''     'Select items'"

		cbsd_menubox || return 0

		retval=$?

		index=${mtag%% *}
		mychoice=${mtag##* }

		case "${mychoice}" in
			"SELECT")
				mtag=
				local num=0
				for i in ${param_list}; do
					eval _mytest=\$$i
					if [ "${_mytest}" = "1" ]; then
						if [ ${num} -eq 0 ]; then
							mtag="${i}"
						else
							mtag="${mtag} ${i}"
						fi
						num=$(( num + 1 ))
					fi
				done
#				printf "${mtag}"
				return 0
			;;
			"-")
				continue
				;;
			*)
				eval _mytest=\$$mychoice
				if [ ${_mytest} = "1" ]; then
					export ${mychoice}="0"
				else
					export ${mychoice}="1"
				fi
				defaultitem="${mychoice}"
				;;
		esac
	done

	mtag=$( cbsdsql ${formfile} SELECT id FROM ${table} WHERE text=\"${menu_choice}\" )

	return $retval
}

reload_forms_full()
{
	sql_part="SELECT param FROM ${table} WHERE type != \"subtable\""
	sql_part="${sql_part} ORDER BY order_id"
	param=$( cbsdsql ${formfile} ${sql_part} )
	load_forms
	load_new
}


group_add()
{
	[ ! -x ${moduledir}/forms.d/${module}/custom_forms.sh ] && err 1 "${MAGENTA}Forms not support for dynamic data, no such: ${GREEN}${moduledir}/forms.d/${module}/custom_forms.sh${NORMAL}"
	${moduledir}/forms.d/${module}/custom_forms.sh -a add -f ${formfile}
}

# $1 - overvrite index
group_del()
{
	local _group_id

	[ ! -x ${moduledir}/forms.d/${module}/custom_forms.sh ] && err 1 "${MAGENTA}Forms not support for dynamic data, no such: ${GREEN}${moduledir}/forms.d/${module}/custom_forms.sh${NORMAL}"

	if [ -n "${1}" ]; then
		_group_id="${1}"
	else
		_group_id="${index}"
	fi

	if [ -n "${_group_id}" ]; then
		${moduledir}/forms.d/${module}/custom_forms.sh -a delete -f ${formfile} -i ${_group_id}
	else
		${moduledir}/forms.d/${module}/custom_forms.sh -a delete -f ${formfile}
	fi
}


# inputform
get_helper_value()
{
	local _input _retval _type _link _mtag _group_id

	f_dialog_title " ${mtag} "

	eval VAL=\$${mtag}
	eval _mydesc=\$${mtag}_desc
	eval _type=\$${mtag}_type
	eval _link=\$${mtag}_link
	eval _group_id=\$${mtag}_group_id

	# errcode from dialog
	local dialog_ok=0

	case "${_type}" in
		inputbox)
			f_dialog_input _input "${_mydesc}" "${VAL}" "${_message}" || return $?
			;;
		password)
			_defaultvalue="${defaultvalue}"
			_mtag="${mtag}"
			if get_password ${_link}; then
				eval ${_mtag}_password="\"${mtag}\""
				_input="*****"
				dialog_ok="1"
			fi
			mtag="${_mtag}"
			defaultvalue="${_defaultvalue}"
			;;
		radio|select)
			_defaultvalue="${defaultvalue}"
			_mtag="${mtag}"
			if get_radio ${_link}; then
				_input="${mtag}"
				dialog_ok="1"
			fi
			mtag="${_mtag}"
			defaultvalue="${_defaultvalue}"
			;;
		checkbox)
			_defaultvalue="${defaultvalue}"
			_mtag="${mtag}"
			if get_checkbox ${_link}; then
				_input="${mtag}"
				dialog_ok="1"
			fi
			mtag="${_mtag}"
			defaultvalue="${_defaultvalue}"
			;;
		group_add)
			# add button
			# echo "${moduledir}/forms.d/${module}/initforms.sh"
			group_add
			reload_forms_full
			;;
		group_del)
			# add button
			# echo "${moduledir}/forms.d/${module}/initforms.sh"
			group_del ${_group_id}
			reload_forms_full
			;;
		*)
			;;
	esac

	[ -n "${_input}" -o "${dialog_ok}" = "1" ] && eval ${mtag}="\"${_input}\""
}


#### [ MAIN AREA ] ####
# we work in two modes:
# when we got bootstrap file ( which shall contain install_img )
# or only formfile ( can be set in boostrap )
#
# When no bootstrap - load and execute form then exist
# when bootstrap exist - after form execute install_img func
#
# Check for cbsd_puppet_jname jail exist
if [ "${jname}" != "CBSDSYS" ]; then
#	jstatus jname=${cbsd_helper_jname} >/dev/null 2>&1
#	[ $? -ne 1 ] && err 1 "${MAGENTA}No such ${GREEN}${cbsd_helper_jname}${MAGENTA} for helper ${GREEN}${helper_module}${MAGENTA}. Please fetch it via repo command or create from template${NORMAL}"
else
	with_bootstrap=1
fi

# Show list modules with no arg
if [ -z "${1}" ]; then
	[ ${header} -eq 1 ] && ${ECHO} "${MAGENTA}Current helper module: ${GREEN}${helper_module}${NORMAL}"
	[ ! -d ${moduledir}/${helper_module}.d ] && exit 0
	[ ${header} -eq 1 ] && ${ECHO} "${MAGENTA}Available modules:${NORMAL}"
	[ ${header} -eq 1 ] && ${ECHO} "${BOLD}"

	# rename helper_module to forms-<helper>-name!!!
	/usr/bin/find ${moduledir}/forms.d/  -type d -depth 1 -maxdepth 1 -exec /usr/bin/basename {} \; |/usr/bin/sort| while read _dir; do
		p1=${_dir%%_*}
		p2=${_dir##*_}
		echo ${p2}
	done

	[ ${header} -eq 1 ] && ${ECHO} "${NORMAL}"
	exit 0
fi

if [ -n "${jname}" ]; then

	case "${jname}" in
		cbsdpuppet1|CBSDSYS)
			with_bootstrap=1
			;;
		*)
			. ${jrcconf}
			[ $? -eq 1 ] && err 1 "${MAGENTA}No such jail: ${GREEN}${jname}${NORMAL}"
			with_bootstrap=1
			: ${with_bootstrap=1}
			;;
	esac
fi

: ${with_bootstrap=0}

# imghelper_version
# Compare this YYYMM serial with database forms version. When forms have greater number
# this helper is not support this
imghelper_version="201607"
cfg_existing=0

[ -z "${updcol}" ] && updcol="new"

# read global H_ environment from file
readconf forms_env.conf

if [ -n "${jname}" -a -n "${module}" ]; then
	formfile="${jailsysdir}/${jname}/helpers/${module}.sqlite"
	if [ ! -r ${formfile} ]; then
		formfile="${workdir}/formfile/${module}.sqlite"
		cfg_existing=0
	else
		cfg_existing=1
		updcol="cur"
	fi
elif [ -n "${module}" ]; then
	: ${formfile="${workdir}/formfile/${module}.sqlite"}
elif [ -n "${jname}" ]; then
	[ ! -d ${jailsysdir}/${jname}/helpers ] && exit 0
	[ ${header} -eq 1 ] && ${ECHO} "${MAGENTA}Available modules for ${GREEN}${jname}${MAGENTA}:${NORMAL}"
	[ ${header} -eq 1 ] && ${ECHO} "${BOLD}"

	/usr/bin/find ${jailsysdir}/${jname}/helpers/ -type f -depth 1 -maxdepth 1 -name \*.sqlite -exec /usr/bin/basename {} \; |while read _dir; do
		p1=${_dir%%_*}
		p2=${_dir##*_}
		echo ${p2} |/usr/bin/sed 's/\.sqlite//g'
	done
	[ ${header} -eq 1 ] && ${ECHO} "${NORMAL}"
	exit 0
fi

# update formfile
[ ! -d "${workdir}/formfile" ] && /bin/mkdir ${workdir}/formfile

if [ -n "${module}" ]; then
	[ -f "${moduledir}/forms.d/${module}/helpers.conf" ] && . ${moduledir}/forms.d/${module}/helpers.conf
	mksitefile="${moduledir}/forms.d/${module}/initforms.sh"
	[ ! -f "${mksitefile}" ] && err 1 "No ${mksitefile}"
	/bin/sh ${mksitefile}
fi

[ ! -f "${formfile}" ] && err 1 "Formfile doesn't exist: ${formfile}"

if [ -z "${helper_workdir}" ]; then
	helper_workdir=$( /usr/bin/dirname ${formfile} )
fi

check_version
init_title
reload_forms_full

# in non interactive mode we apply default settings
if [ "${inter}" = "0" ]; then
	x=0
else
	x=1
fi

while [ ${x} -eq 1 ]; do
	dialog_menu_main
	ret=$?
	case $ret in
		${DIALOG_OK})
			case "${mtag}" in
				-)
					continue
					;;
				"COMMIT")
					if all_filled; then
						x=0
						continue
					else
						f_dialog_msgbox "All field is mandatory"
					fi
					continue
					;;
				*)
					get_helper_value
					# reread
					#sql_part="${sql_part} ORDER BY order_id"
					#param=$( cbsdsql ${formfile} ${sql_part} )
					#load_forms
					#load_new
					;;
			esac
			;;
		*)
			exit 0
			;;
	esac
done

# mostly for inter=0 operation (e.g. webdev/clonos/other frontend)
# before with_bootstrap exit
case "${group}" in
	add)
		group_add
		;;
	del)
		group_del
		;;
	*)
		;;
esac

# export global variable to new module (when init)
if [ -r "${moduledir}/puppet.d/sync_env2form" ]; then
	sync_env2form
fi

# no bootrstap? this is the end my beautiful friend
[ ${with_bootstrap} -eq 0 ] && exit 0

update_params ${updcol}

# commit when works with module
if [ -n "$helper_module}" ]; then
	case "${jname}" in
		CBSDSYS)
			echo "HERE ${formfile}"
			${moduledir}/forms.d/${module}/cbsdsys ${formfile}
			;;
		cbsdpuppet1)
			[ -z "${out}" ] && out="/dev/stdout"
			${helper_module} jname=${jname} module=${module} mode=manifest > ${out}
			;;
		*)
			case "${helper_module}" in
				cbsdsys)
					${moduledir}/forms.d/${module}/cbsdsys ${formfile} ${jname}
					;;
				*)
					${helper_module} jname=${jname} module=${module} mode=apply
					# re-export global variable
					if [ -r "${moduledir}/puppet.d/sync_env2form" ]; then
						sync_env2form
					fi

					# Looking for helpers pre/post hooks
					if [ -d "${moduledir}/forms.d/${module}/jail-system-default" ]; then
						cd ${moduledir}/forms.d/${module}/jail-system-default
						for i in $( /usr/bin/find . -type f -depth 2 -maxdepth 2 ); do
							jp=$( echo ${i} | /usr/bin/sed s:^./:${jailsysdir}/${jname}\/:g )
							if [ ! -r ${jp} ]; then
								${ECHO} "${MAGENTA}Install helpers hook: ${GREEN}${jp}${NORMAL}"
								/bin/cp -a ${i} ${jp}
							fi
						done
					fi

					;;
			esac
			;;
	esac
fi

exit 0
