#!/usr/local/bin/cbsd
#v11.1.3
MYARG=""
MYOPTARG="mode"
MYDESC="Ncurses based Bhyve guest creation wizard"
EXTHELP="wf_bcreate.html"
ADDHELP="mode=full for all atributes\n"

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

init $*

. ${settingstui}
. ${dialog}

gen_newjail_conf()
{
	local _i _required _mytest _ret

	_required="jname host_hostname ip4_addr ver arch imgsize"

	msg_ok="ok"

	for _i in ${_required}; do
		eval _mytest=\$$_i
		if [ -z "${_mytest}" ]; then
			f_dialog_msgbox "${_i} must be not non-empty" "Error"
			return 0
		fi
	done

	#check for ip if oninterface
	if [ "${interface}" != "0" -a -n "${ip4_addr}" ]; then
		checkip ip=${ip4_addr} check=1 2>/dev/null
		case $? in
			2)
				msg_yes="ok"
				msg_no="not ok"
				f_dialog_noyes "It seems like ${ip4_addr} address already used on several devices on the LAN\nYou can found MAC address by \"arp -an\" command.\n If you believe that it's ok, choose 'ok' to continue or 'not ok' for another IP address" "WARNING"
				case $? in
					0)
						;;
					*)
						return 0
						;;
				esac
		esac
	fi

	gen_jconf
	ERR=$?

	[ ${ERR} -eq 0 ] || err 1 "${MAGENTA}Bad conf${NORMAL}"
	err 0 ${A}
}

dialog_menu_main()
{
	local title=" ${product} v${myversion} "
	local btitle="$DIALOG_BACKTITLE"
	local prompt="Use menu for construct jail create config file"

	defaultitem= # Calculated below

	local hline=
	local mark
	local i _mytest

	f_dialog_default_fetch defaultitem

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

	item_let="A"
	item_num="0"
	local menu_list=""

	menu_list="${menu_list} '${item_let} vm_os_type'	'$(curval vm_os_type)'		'Guest OS type'"
	inc_menu_index item_let
	menu_list="${menu_list} '${item_let} vm_os_profile'	'$(curval vm_os_profile)'	'Guest OS profile'"
	inc_menu_index item_let

	if [ "${from_jail}" = "1" -a "${bhyve_profile}" != "FreeBSD-bsdinstall-jail" ]; then
		menu_list="${menu_list}	'${item_let} jprofile'	'$(curval jprofile)'	'Select jail profile for jcreate'"
	fi

	local vm_package_num=$( cbsdsql local SELECT COUNT\(name\) FROM vmpackages )

	if ! is_number ${vm_package_num}; then
		if [ ${vm_package_num} -gt 0 ]; then
			menu_list="${menu_list} '${item_let} vm_package'	'$(curval vm_package)'		'Package group name'"
			inc_menu_index item_let
		fi
	fi

	menu_list="${menu_list} '${item_let} jname'		'$(curval jname)'		'A short jail name'"
	inc_menu_index item_let
	menu_list="${menu_list} '${item_let} host_hostname'	'$(curval host_hostname)'	'Full (FQDN) jail hostname'"
	inc_menu_index item_let
	menu_list="${menu_list} '${item_let} imgsize'		'$(curval imgsize)'		'reserved (expand) X size for free space'"
	inc_menu_index item_let
	menu_list="${menu_list} '${item_let} ip4_addr'		'$(curval ip4_addr)'		'Assing IP address'"
	inc_menu_index item_let
	menu_list="${menu_list} '${item_let} vm_ram'		'$(curval vm_ram)'		'RAM'"
	inc_menu_index item_let
	menu_list="${menu_list} '${item_let} vm_cpus'		'$(curval vm_cpus)'		'CPUs number'"
	inc_menu_index item_let
	menu_list="${menu_list} '${item_let} vm_iso_path'	'$(curval vm_iso_path)'		'ISO Path for CD-ROM'"
	inc_menu_index item_let
	menu_list="${menu_list} '${item_let} vm_hostbridge'	'$(curval vm_hostbridge)'	'VMs hostbridge'"
	inc_menu_index item_let
	menu_list="${menu_list} '${item_let} astart'		'[${astart_mark}]'		'Autostart with system'"
	inc_menu_index item_let
	menu_list="${menu_list} '${item_let} interface'		'$(curval interface)'		'Interface selection and aliasing mode'"

	if [ ${freebsdhostversion} -gt 1100119 ]; then
		inc_menu_index item_let
		menu_list="${menu_list} '${item_let} vm_vnc_port'	'$(curval vm_vnc_port)'		'VNC port'"
	else
		# Disable for FreeBSD 11 < 1100120
		vm_vnc_port=1
	fi

	inc_menu_index item_let
	menu_list="${menu_list} '${item_let} vm_efi'		'$(curval vm_efi)'		'UEFI Boot mode'"
	inc_menu_index item_let
	menu_list="${menu_list} '${item_let} vm_console'	'$(curval vm_console)'		'Output console'"

	if [ "${zfsfeat}" = "1" ]; then
		menu_list="${menu_list} '-'		'-'	''"
		inc_menu_index item_num
#		menu_list="${menu_list} '${item_num} zfsfeature'	'ZFS-features >>'	'Additional ZFS-based features'"
		menu_list="${menu_list} '${item_num} imgtype'		'$(curval imgtype)'	'ZVOL or MD disk type'"
		inc_menu_index item_num
		menu_list="${menu_list} '${item_num} zfs_snapsrc'	'$(curval zfs_snapsrc)'	'Create bhyve from ZFS snapshot'"
	fi

	menu_list="${menu_list} '${item_num} vm_cpu_topology'	'$(curval vm_cpu_topology)'	'Select VM CPU topology'"
	inc_menu_index item_num
	menu_list="${menu_list} '${item_num} bhyve_options'	'Bhyve options >>'	'Customize bhyve options: acpi:${bhyve_generate_acpi}, wire:${bhyve_wire_memory} rts_utc:${bhyve_rts_keeps_utc} msi:${bhyve_force_msi_irq} x2apic:${bhyve_x2apic_mode} mptable:${bhyve_mptable_gen} ign_acc:${bhyve_ignore_msr_acc}'"
	inc_menu_index item_num

	if [ "${vm_efi}" != "none" ]; then
		inc_menu_index item_num
		menu_list="${menu_list} '${item_num} bhyve_vnc_options'	'VNC options >>'	'VNC opt: wait:${cd_vnc_wait} res:${bhyve_vnc_resolution} bind:${bhyve_vnc_tcp_bind} vnc_password:XXX'"
	fi

	menu_list="${menu_list} '${item_num} bhyve_flags'	'Additional bhyve_flags'	'Customize additional bhyve_flags. Current: ${bhyve_flags}'"
	inc_menu_index item_num

	if [ "${from_jail}" = "1" -a "${bhyve_profile}" != "FreeBSD-bsdinstall-jail" ]; then
		menu_list="${menu_list} '-'	'JAIL SUB:'	'fromjail submenu'"
		[ -z "${swapsize}" ] && swapsize="4g"
		inc_menu_index item_let
		menu_list="${menu_list} '${item_let} vm_guestfs'	'$(curval vm_guestfs)'	'Choose filesystem for boot image'"
		inc_menu_index item_let
		menu_list="${menu_list} '${item_let} swapsize'	'$(curval swapsize)'	'Allocate and Configure for swap partition'"
		inc_menu_index item_let
		menu_list="${menu_list} '${item_let} pkglist'	'$(curval pkgnum)'	'mark pkg for install from repo'"
		inc_menu_index item_let
		menu_list="${menu_list} '${item_let} gw4'		'$(curval gw4)'	'Default router for bhyve or vimage'"
		inc_menu_index item_let
		menu_list="${menu_list} '${item_let} ver'		'$(curval ver)'	'choose code base version'"
		inc_menu_index item_let
		menu_list="${menu_list} '${item_let} applytpl'	'$(curval applytpl)'	'Apply cbsd templates'"
		inc_menu_index item_let
		menu_list="${menu_list} '${item_let} floatresolv'	'$(curval floatresolv)'	'Auto correct for jail resolv.conf'"
		inc_menu_index item_let
		menu_list="${menu_list} '${item_let} arch'		'$(curval arch)'	'target arch'"
		inc_menu_index item_num
		menu_list="${menu_list} '${item_num} user_pw_root'	'Root Password'	'Change jail root password'"
		inc_menu_index item_num
		menu_list="${menu_list} '${item_num} add_user'	'$(curval user_add)'	'Create additional account within VM'"
		inc_menu_index item_num
		menu_list="${menu_list} '${item_num} services'		'Services >>'	'Toggle Startup Services'"
		inc_menu_index item_num
		menu_list="${menu_list} '${item_num} pkglist'	'$(curval pkgnum)'	'mark pkg for install from repo'"
	fi

	menu_list="${menu_list} '-'	'-'	'fromjail submenu'"
	inc_menu_index item_num
	menu_list="${menu_list} '${item_num} GO'	'PROCEED!'	'PROCEED!'"

	cbsd_menubox_with_help
	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 "${MAGENTA}no such conf file${NORMAL}"
. ${localcbsdconf}
. ${inventory}

zero_profile="bhyve-default-default.conf"
default_profile="bhyve-default-default.conf"

#defaults
. ${buildconf}

init_bhyve
readconf ${default_profile}
readconf vnc.conf

# re-read profile for init global_profile_file variable
get_construct_profile ${default_profile}
[ -z "${profile}" -a -n "${jail_profile}" ] && profile="${jail_profile}"

[ -z "${bhyve_vnc_resolution}" ] && bhyve_vnc_resolution="${default_vnc_width}x${default_vnc_height}"
[ -z "${bhyve_vnc_tcp_bind}" ] && bhyve_vnc_tcp_bind="${default_vnc_tcp_bind}"
[ -z "${bhyve_vnc_vgaconf}" ] && bhyve_vnc_vgaconf="${default_vnc_vgaconf}"
[ -z "${vnc_password}" ] && vnc_password="${default_vnc_password}"
[ -z "${imgtype}" ] && imgtype="zvol"

baserw=1
ip4_addr="DHCP"
jprofile="default"

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

if [ "${default_profile}" = "default" -a -r ${tmpdir}/bconstruct.conf ]; then
	. ${tmpdir}/bconstruct.conf
	if [ -n "${last_vm_os_type}" ]; then
		vm_os_type="${last_vm_os_type}"
		get_construct_vm_os_type ${vm_os_type}
	fi
	if [ -n "${last_vm_os_profile}" ]; then
		vm_os_profile="${last_vm_os_profile}"
		get_construct_vm_os_profile ${vm_os_profile}
	fi
else
	vm_iso_path="${register_iso_as}"
	apply_vm_package
fi

while [ 1 ]; do
	pkgnum=0
	[ -n "${pkglist}" -a "${pkglist}" != "NO" ] && pkgnum=$( /usr/bin/wc -w ${pkglist} | /usr/bin/awk '{printf $1}' )

	dialog_menu_main
	retval=$?

	if [ $retval -eq $DIALOG_HELP ]; then
		get_help
		continue
	elif [ $retval -ne $DIALOG_OK ]; then
		f_die
	fi

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

	case "${mychoice}" in
		"EXIT")
			exit 0
			;;
		"GO")
			# store last choices
			sysrc -qf ${tmpdir}/bconstruct.conf last_vm_os_type="${vm_os_type}" > /dev/null 2>&1
			sysrc -qf ${tmpdir}/bconstruct.conf last_vm_os_profile="${vm_os_profile}" > /dev/null 2>&1
			gen_newjail_conf
			;;
		"-")
			continue
			;;
		interface)
			get_construct_interface -d 1 -s "tap bridge vboxnet lo xnb" -b 1
			;;
		astart|bhyve_generate_acpi|bhyve_wire_memory|bhyve_rts_keeps_utc|bhyve_force_msi_irq|bhyve_x2apic_mode|bhyve_mptable_gen|bhyve_ignore_msr_acc)
			invert_checkbox ${mychoice}
			continue
			;;
		*)
			get_construct_${mychoice}
			;;
	esac
done

