#!/usr/local/bin/cbsd
. ${subr}
. ${tools}
. ${dialog}
. ${strings}

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

	local btitle="$DIALOG_BACKTITLE"

	local title=" Nic properties ${jname}:${nic_path} "
	hline=

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

	eval $( cbsdsql ${jailsysdir}/${jname}/local.sqlite SELECT id,nic_driver,nic_slot,nic_type,nic_parent,nic_hwaddr,nic_address,nic_mtu FROM bhyvenic WHERE id=\"${nic}\" AND jname=\"${jname}\" | while read nic_id nic_driver nic_slot nic_type nic_parent nic_hwaddr nic_address nic_mtu; do
		echo "export nic_id=\"${nic_id}\""
		echo "export nic_driver=\"${nic_driver}\""
		echo "export nic_slot=\"${nic_slot}\""
		echo "export nic_type=\"${nic_type}\""
		echo "export nic_parent=\"${nic_parent}\""
		echo "export nic_hwaddr=\"${nic_hwaddr}\""
		echo "export nic_address=\"${nic_address}\""
		echo "export nic_mtu=\"${nic_mtu}\""
	done ) || err 1 "${MAGENTA}Error while create NIC map${NORMAL}"

	local menu_list="
		'nic_driver'	'${nic_driver}'		'NIC driver'
		'nic_parent'	'${nic_parent}'		'NIC parent interface. 0 - auto'
		'nic_hwaddr'	'${nic_hwaddr}'		'NIC Mac address. 0 - auto'
		'nic_type'	'${nic_type}'		'Select NIC type'
		'nic_address'	'${nic_address}'	'Assign IPs on this nic (hoster side)'
		'nic_mtu'	'${nic_mtu}'		'NIC MTU. 0 - auto'
		'-'		'-'			''
		'remove'	'remove'		'Detach and remove NIC'
	" # END-QUOTE

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

	# 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 \"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
}


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

MYARG="jname nic"
MYOPTARG=""
MYDESC="Edit properties for vitual image of VM"
CBSDMODULE="bhyve"

globalconf="${workdir}/cbsd.conf";

set -e
. ${globalconf}
set +e

. ${subr}
. ${strings}
. ${tools}
. ${vimageconf}
init $*

. ${workdir}/bsdconfig.subr
#f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages-bhyvenic.subr
. $BSDCFG_LIBE/$APP_DIR/include/messages-bhyvenic.subr

. ${jrcconf}
[ $? -eq 1 ] && err 1 "${MAGENTA}No such VM: ${GREEN}${jname}${NORMAL}"
[ "${emulator}" != "bhyve" ] && err 1 "${MAGENTA}Not in bhyve mode${NORMAL}"

. $BSDCFG_LIBE/$APP_DIR/include/bhyvenic.subr
. ${workdir}/bhyve.subr

# Incorporate rc-file if it exists
[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"

#
# 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 " $msg_add_bhyvenic "
f_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
f_mustberoot_init

. ${workdir}/bhyve.subr
. ${settingstui}

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

	command=
	case $ret in
		${DIALOG_OK})
			f_dialog_menutag_fetch mtag
			case "$mtag" in
				?" $msg_exit")
					break
					;;
				"-"|slot|size|nic_type)
					continue
					;;
				"nic_driver")
					get_nic_driver && update_nic_driver ${nic_id}
					;;
				"nic_address")
					get_construct_ip4_addr && nic_address="${ip4_addr}" && update_nic_address ${nic_id}
					;;
				"nic_hwaddr")
					get_construct_nic_hwaddr && update_nic_hwaddr ${nic_id}
					;;
				"nic_mtu")
					get_construct_nic_mtu && update_nic_mtu ${nic_id}
					;;
				"nic_parent")
					case "${nic_driver}" in
						vtnet)
							get_nic_parent && update_nic_parent ${nic_id}
							;;
						vale)
							get_vale_switch && update_nic_parent ${nic_id}
							;;
					esac
					;;
				"remove")
					if getyesno "Detach and remove NIC from ${jname} VM?"; then
						bhyve_remove_nic "${nic_id}"
						f_die
					fi
					;;
				*)
					;;
			esac
			;;
		${DIALOG_HELP})
			get_help
			continue
			;;
		*)
			f_die
			;;
	esac
done

return $SUCCESS

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