#!/usr/local/bin/cbsd
MYARG=""
MYOPTARG=""
MYDESC="Operate with virtual VALE switch - TUI"
CBSDMODULE="bhyve"
EXTHELP="wf_bhyvenetwork"

. ${subrdir}/nc.subr
. ${cbsdinit}


############################################################ FUNCTIONS

# dialog_menu_main
#
# Display the dialog(1)-based application main menu.
#
dialog_menu_main()
{
	local _input _retval

	local btitle="$DIALOG_BACKTITLE"

	local title=" VALE switch list "
	hline=

	local prompt="${_desc}"
	local sqldelimer=" "

	local mark

	local menu_list=$( valecfg mode=list header=0 display=name | while read name; do
		eval mark=\$vale_selected_${name}
		if [ "${mark}" = "1" ]; then
			mark="X"
		else
			mark=" "
		fi
		echo "'${name}'	'[${mark}] vale=${name}'	'Switch named ${name}'"
	done ) || err 1 "${N1_COLOR}Error while create vale map${N0_COLOR}"

	[ -z "${menu_list}" ] && menu_list="''	'no data'	''"

	local height width rows
	eval f_dialog_menu_with_help_size height width rows \
		\"\$title\"  \
		\"\$btitle\" \
		\"\$prompt\" \
		\"\$hline\"  \
		$menu_list

	height=$(( height + 1 ))

	# Obtain default-item from previously stored selection
	f_dialog_default_fetch defaultitem

	local menu_choice
	menu_choice=$( eval $DIALOG \
		--clear                                 \
		--title \"\$title\"                     \
		--backtitle \"\$btitle\"                \
		--hline \"\$hline\"                     \
		--item-help                             \
		--ok-label \"\$msg_ok\"                 \
		--cancel-label \"Remove\"               \
		--extra-button                          \
		--extra-label \"Add\"                   \
		--help-button				\
		--help-label \"Exit\"			\
		${USE_XDIALOG:+--help \"\"}             \
		--default-item \"\$defaultitem\"        \
		--menu \" \$prompt \"                   \
		$height $width $rows                    \
		$menu_list                              \
		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
	)

	local retval=$?
	f_dialog_data_sanitize menu_choice
	f_dialog_menutag_store "$menu_choice"

	# Only update default-item on success
	[ $retval -eq $DIALOG_OK ] && f_dialog_default_store "$menu_choice"
	return $retval
}


vale_add()
{
	local _par VAL
	local btitle="$DIALOG_BACKTITLE"
	local prompt="Use menu to select and edit limit"
	local hline= i _exist
	local _exist_vale_list _next_vale_name
	# default
	local menu_list=

	_exist_vale_list=$( valecfg mode=list header=0 display=name | ${XARGS_CMD} )

	local title=" new vale switch "
	local _mydesc

	for i in $( ${SEQ_CMD} 1 255 ); do
		_next_vale_name="vale${i}"

		_exist=0

		for j in ${_exist_vale_list}; do
			if [ "${j}" = "${_next_vale_name}" ]; then
				_exist=1
				break
			fi
		done

		[ ${_exist} -eq 0 ] && break

	done

	menu_list="
		'name'		'${name}'		'Switch name'
	"

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

	cbsd_menubox
	retval=$?

	local name

	case ${retval} in
		${DIALOG_OK})
			case "${mtag}" in
				"-"|"EXIT")
					return 1
					;;
				name)
					name=
					prompt="enter corrent vale switch name, e.g: vale1"
					defaultitem="${_next_vale_name}"

					cbsd_inputbox_simple && name="${mtag}"
					[ -z "${name}" ] && return 0
					valecfg mode=add name="${name}"
					retval=$?
					return ${retval}
					;;
			esac
	esac

	return ${retval}
}


vale_remove()
{
	local _i
	local _vales=

	local vale_list=$( valecfg mode=list header=0 display=name | ${XARGS_CMD} )

	for _i in ${vale_list}; do
		eval mark=\$vale_selected_${_i}
		[ "${mark}" = "1" ] && _vales="${_vales} ${_i}"
	done

	for _i in ${_vales}; do
		valecfg mode=delete name="${_i}"
	done

}


############################################################ MAIN
export NOCOLOR=1

. ${subrdir}/settings-tui.subr
. ${dialog}

#
# Process command-line arguments
#
while getopts h$GETOPTS_STDARGS flag; do
	case "$flag" in
	h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm" ;;
	esac
done
shift $(( $OPTIND - 1 ))

#
# Initialize
#
f_dialog_title " vales "
f_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
f_mustberoot_init


#
# Loop over the main menu until we've accomplished what we came here to do
#
while :; do
	dialog_menu_main
	ret=$?

	case $ret in
		${DIALOG_OK})
			f_dialog_menutag_fetch mtag
			case "$mtag" in
				?" $msg_exit")
					break
					;;
				"-")
					continue
					;;
				*)
					vale=${mtag%% *}
					eval mark=\$vale_selected_${vale}
					if [ "${mark}" = "1" ];then
						eval "vale_selected_${vale}=\"0\""
					else
						eval "vale_selected_${vale}=\"1\""
					fi
					;;
			esac
			;;
		${DIALOG_CANCEL})
			vale_remove
			continue
			;;
		${DIALOG_EXTRA})
			vale_add
			continue
			;;
		*)
			f_die
			;;
	esac
done

exit $SUCCESS

################################################################################
# END
################################################################################
