#!/usr/local/bin/cbsd
#v14.2.5
MYARG=""
MYOPTARG="out jname"
CBSDMODULE="bhyve"
MYDESC="Ncurses based bhyve LPC configurator"
EXTHELP="wf_jorder"

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

. ${cbsdinit}

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

dialog_menu_main()
{
	local title=" ${product} v${myversion} "
	local btitle="$DIALOG_BACKTITLE"
	local prompt="Use menu to configure LPC device for ${jname}"
	local defaultitem=
	local hline=
	local i= jnum=

	local menu_list=" \
		'EXIT'		'' \
		'-'		'' \
	" # END-QUOTE

	jnum=0

	OIFS="${IFS}"
	IFS="|"
	eval $( cbsdsqlro ${sqlite_database} "SELECT lpcslot_name,lpcslot_value,lpcslot_desc FROM lpc ORDER BY CAST(lpcslot_name AS TEXT) ASC;" | while read _name _value _desc; do
		IFS="${OIFS}"
		#echo "[${_name}][${_value}][${_desc}]" >> /tmp/ok.txt
		echo "export lpc_${jnum}_name=\"${_name}\""
		echo "export lpc_${jnum}_value=\"${_value}\""
		echo "export lpc_${jnum}_desc=\"${_desc}\""
		echo "export lpc_num=\"${jnum}\""
		jnum=$(( jnum + 1 ))
		IFS="|"
	done )

	IFS="${OIFS}"

	#echo "NUM: ${lpc_num}"

	if [ "${lpc_num}" = "0" ]; then
		err 1 "${N1_COLOR}${CBSD_APP} error: wrong 'lpc' table in ${sqlite_database}: ${N2_COLOR}${jname}${N0_COLOR}"
	fi

	item_num="0"
	local menu_list=""

	for i in $( ${SEQ_CMD} 0 ${lpc_num} ); do
		eval name="\$lpc_${i}_name"
		eval value="\$lpc_${i}_value"
		eval desc="\$lpc_${i}_desc"
		menu_list="${menu_list} '${item_num} ${name}'	'${value}'	'${desc}'"
		inc_menu_index item_num
	done

	menu_list="${menu_list} '-'	'-'	''"
	menu_list="${menu_list} 'EXIT'	'EXIT'	'Exit from TUI'"

	[ -n "${menu_choice}" ] && defaultitem="${menu_choice}"


	#cbsd_menubox_with_help
	cbsd_menubox
	retval=$?

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

	return ${retval}
}


#### [ MAIN AREA ] ####
[ ! -f ${localcbsdconf} ] && err 1 "${N1_COLOR}no such conf file${N0_COLOR}"
. ${localcbsdconf}
. ${inventory}

f_dialog_title "$msg_system_console_configuration"
f_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
f_mustberoot_init

### MAIN ###
if [ -z "${out}" ]; then
	[ -z "${jname}" ] && jname="${1}"
	[ -z "${jname}" ] && select_jail_by_list -s "List of local bhyves:" -r 0 -e bls
	[ -z "${jname}" ] && err 1 "please specify jname"
	sqlite_database="${jailsysdir}/${jname}/local.sqlite"
else
	sqlite_database="${out}"
fi

while [ 1 ]; do
	dialog_menu_main || f_die
	retval=$?

	f_dialog_menutag_fetch mtag

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

	case "${mychoice}" in
		"EXIT")
			exit 0
			;;
		"-")
			continue
			;;
		bootrom)
			# bhyve form for $efi_firmware
			bootrom=$( cbsdsqlro ${sqlite_database} "SELECT lpcslot_value FROM lpc WHERE lpcslot_name='bootrom'" )
			obootrom="${bootrom}"
			get_construct_bootrom
			[ "${obootrom}" != "bootrom" ] && cbsdsqlrw ${sqlite_database} "UPDATE lpc SET lpcslot_value='${bootrom}' WHERE lpcslot_name='bootrom'"
			;;
		com*)
			eval cfg_name="\$mychoice"
			# bhyve form for $com
			com=$( cbsdsqlro ${sqlite_database} "SELECT lpcslot_value FROM lpc WHERE lpcslot_name='${cfg_name}'" )
			ocom="${orig_val}"
			get_construct_com "${cfg_name}"
			[ "${com}" != "${ocom}" ] && cbsdsqlrw ${sqlite_database} "UPDATE lpc SET lpcslot_value='${com}' WHERE lpcslot_name='${cfg_name}'"
			;;
		*)
			get_new_value ${mychoice} ${index}
			;;
	esac
done

exit 0
