#!/usr/local/bin/cbsd
. ${subrdir}/nc.subr

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

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

	local btitle="$DIALOG_BACKTITLE"

	local title=" Packages list "
	hline=

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

	local mark

	local menu_list=$( cbsdsqlro local SELECT name,pkg_vm_cpus,pkg_vm_ram,pkg_vm_disk,timestamp FROM vmpackages | while read name pkg_vm_cpus pkg_vm_ram pkg_vm_disk timestamp; do
		eval mark=\$packages_selected_${name}
		if [ "${mark}" = "1" ]; then
			mark="X"
		else
			mark=" "
		fi
		echo "'${name}'	'[${mark}] CPU=${pkg_vm_cpus} RAM=${pkg_vm_ram} DISK=${pkg_vm_disk}'	'description'"
	done ) || err 1 "${N1_COLOR}Error while create packages 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
}


item_add()
{
	local _par VAL
	local btitle="$DIALOG_BACKTITLE"
	local prompt="Use menu to select and edit limit"
	local hline=

	local title=" Add packages "
	local _mydesc

	local name pkg_vm_cpus pkg_vm_ram pkg_vm_disk

	while [ 1 ]; do

		# default
		[ -z "${name}" ] && name="small1"
		[ -z "${pkg_vm_cpus}" ] && pkg_vm_cpus="1"
		[ -z "${pkg_vm_ram}" ] && pkg_vm_ram="1g"
		[ -z "${pkg_vm_disk}" ] && pkg_vm_disk="10g"

		local menu_list=

		menu_list="
			'name'		'${name}'		'name of the package, one-word, e.g: small1'
			'pkg_vm_cpus'	'${pkg_vm_cpus}'	'Maximum amount of Vcore/CPU, e.g: 1'
			'pkg_vm_ram'	'${pkg_vm_ram}'		'Maximum amount of RAM, e.g: 1m'
			'pkg_vm_disk'	'${pkg_vm_disk}'	'Maximum amount of first disk (bootable), e.g: 10g'
		"

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

		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

		mtag=$( 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 mtag
		f_dialog_menutag_store "$mtag"

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

		case ${retval} in
			${DIALOG_OK})
				if [ "${mtag}" = "COMMIT" ]; then
					[ -z "${name}" ] && f_dialog_msgbox "name must be filled" && continue
					[ -z "${pkg_vm_cpus}" ] && f_dialog_msgbox "pkg_vm_cpus must be filled" && continue
					[ -z "${pkg_vm_ram}" ] && f_dialog_msgbox "pkg_vm_ram must be filled" && continue
					[ -z "${pkg_vm_disk}" ] && f_dialog_msgbox "pkg_vm_disk must be filled" && continue
					cbsdsqlrw local "INSERT INTO vmpackages ( name,pkg_vm_cpus,pkg_vm_ram,pkg_vm_disk ) VALUES ( \"${name}\",\"${pkg_vm_cpus}\",\"${pkg_vm_ram}\",\"${pkg_vm_disk}\" )"
					return ${retval}
				else
					get_construct_vm_packages_${mtag}
					continue
				fi
				;;
			${DIALOG_CANCEL})
				return $retval
				;;
			*)
				return ${retval}
				;;
		esac
	done

}

get_construct_vm_packages_name()
{
	title=" name "
	prompt=" Enter name "
	defaultitem="${name}"
	cbsd_inputbox_simple && name="${mtag}"
}

get_construct_vm_packages_pkg_vm_cpus()
{
	title=" Vcore/CPU "
	prompt=" Enter Vcore, e.g: 1 "
	defaultitem="${pkg_vm_cpus}"
	cbsd_inputbox_simple && pkg_vm_cpus="${mtag}"
}

get_construct_vm_packages_pkg_vm_ram()
{
	title=" ram "
	prompt=" Enter RAM, e.g: 1g "
	defaultitem="${pkg_vm_ram}"
	cbsd_inputbox_simple && pkg_vm_ram="${mtag}"
}

get_construct_vm_packages_pkg_vm_disk()
{
	title=" disk "
	prompt=" Enter 1st disk size, e.g: 10g "
	defaultitem="${pkg_vm_disk}"
	cbsd_inputbox_simple && pkg_vm_disk="${mtag}"
}


item_remove()
{
	[ -z "${mark_list}" ] && return 0

	local _i

	for _i in ${mark_list}; do
		cbsdsqlrw local "DELETE FROM vmpackages WHERE name='${_i}'"
	done

	unset mark_list
	return 0
}


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

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

. ${cbsdinit}

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

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


mark_list=

#
# 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
					;;
				*)
					vhid=${mtag%% *}
					# val=${mtag##* }
					eval mark=\$packages_selected_${vhid}
					if [ "${mark}" = "1" ];then
						eval "packages_selected_${vhid}=\"0\""
						old_mark_list="${mark_list}"
						mark_list=
						for i in ${old_mark_list}; do
							[ "${i}" != "${vhid}" ] && mark_list="${mark_list} ${i}"
						done
					else
						eval "packages_selected_${vhid}=\"1\""
						mark_list="${mark_list} ${vhid}"
					fi
					;;
			esac
			;;
		${DIALOG_CANCEL})
			item_remove
			continue
			;;
		${DIALOG_EXTRA})
			item_add
			continue
			;;
		*)
			f_die
			;;
	esac
done

return $SUCCESS

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