#!/usr/local/bin/cbsd

. ${subr}
. ${strings}
. ${tools}
. ${nodes}

# dialog_menu_main
#
# Display the dialog(1)-based application main menu.
#
dialog_menu_main()
{
	local title="$DIALOG_TITLE"
	local btitle="$DIALOG_BACKTITLE"
	local prompt=""
	local menu_list=
	local defaultitem=
	local hline="Hit ENTER for SELECT"
	local prompt="'ver:XXX' flags means that the images required XXX base"
	local kversion

	local f_dialog_title=" CBSD FreeBSD Images Repository "

	for i in $( seq 1 255 ); do
		eval images_name="\$images${i}_name"
		[ -z "${images_name}" ] && break
		eval mark=\$selected_images${i}

		eval images_arch="\$images${i}_arch"
		eval images_ver="\$images${i}_ver"

		images_descr=

		images_descr="ver:${images_ver}"
		[ -z "${mark}" ] && mark=" "
		menu_list="$menu_list '${i} ${images_name}'	'[${mark}] ${images_descr}'"
	done

	menu_list="$menu_list '-'	''"
	menu_list="$menu_list 'Download'	''"

	local height width rows
	eval f_dialog_menu_size height width rows \
		\"\$DIALOG_TITLE\"     \
		\"\$DIALOG_BACKTITLE\" \
		\"\$prompt\"           \
		\"\$hline\"            \
		$menu_list

	# Obtain default-item from previously stored selection
	f_dialog_default_fetch defaultitem

	local menu_choice
	menu_choice=$( eval $DIALOG \
		--title \"\$DIALOG_TITLE\"         \
		--backtitle \"\$DIALOG_BACKTITLE\" \
		--hline \"\$hline\"                \
		--ok-label \"\$msg_ok\"            \
		--cancel-label \"\$msg_cancel\"    \
		--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 $DIALOG_OK
}


download_images()
{
	local _fetch_images=
	local mark
	local i
	local _res
	local _imgname _imgver

	for i in $( seq 1 255 ); do
		eval images_name="\$images${i}_name"
		eval images_ver="\$images${i}_ver"

		[ -z "${images_name}" ] && break
		eval mark=\$selected_images${i}
		[ "${mark}" = "X" ] && _fetch_images="${_fetch_images} ${images_name}:${images_ver}"
	done

	[ -z "${_fetch_images}" ] && return 0

	for i in ${_fetch_images}; do
			_imgname=${i%%:*}
			_imgver=${i##*:}
		echo
		echo "exec: cbsd repo action=get sources=img name=${_imgname} ver=${_imgver} usehelpers=1"

		# return stdout
		exec 3>&-
		export DIALOG="${DIALOG}"
		repo action=get sources=img name=${_imgname} useconfig=0 ver=${_imgver} usehelpers=1
		eval exec $TERMINAL_STDOUT_PASSTHRU\>\&1
		eval exec $TERMINAL_STDERR_PASSTHRU\>\&2

		if [ -f "${jailsysdir}/${_imgname}/bin/bootstrap.sh" ]; then
			imghelper bootstrap=${jailsysdir}/${_imgname}/bin/bootstrap.sh jname=${_imgname}
			sleep 5
		else
			${ECHO} "${MAGENTA}No such bootstrap file: ${GREEN}${jailsysdir}/${_imgname}/bin/bootstrap.sh${MAGENTA}, skip.${NORMAL}"
			sleep 5
		fi
	done

	echo "Press a key"
	read p
}


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

. ${workdir}/bsdconfig.subr
f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages-repo.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_repo_images "
f_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
f_mustberoot_init

imageslist=$( mktemp )
f_dialog_info "Obtain index files from ${repo}. Please wait..."
trap "rm -f ${imageslist}" HUP INT ABRT BUS TERM EXIT
res=$( 2>/dev/null repo quiet=1 action=list sources=img ver=any > ${imageslist} )

i=1

eval $( /bin/cat ${imageslist} |while read _line _arch _ver; do
	echo "images${i}_name=\"${_line}\""
	echo "images${i}_arch=\"${_arch}\""
	echo "images${i}_ver=\"${_ver}\""
	i=$(( i + 1 ))
done )

#
# Loop over the main menu until we've accomplished what we came here to do
#
while :; do
	dialog_menu_main || break
	f_dialog_menutag_fetch mtag

	[ -z "${mtag}" ] && exit $SUCCESS

	command=

	case "$mtag" in
		?" $msg_exit") break ;;
		"Download")
				download_images
				exit 0
				;;
		"-")
				continue
				;;
		*)
			index=${mtag%% *}
			images=${mtag##* }
			eval mark=\$selected_images${index}
			if [ "${mark}" = "X" ];then
				eval "selected_images${index}=\" \""
			else
				eval "selected_images${index}=\"X\""
			fi
			continue
			;;
	esac

	if [ "$command" ]; then
		$BSDCFG_LIBE/$APP_DIR/$command ${USE_XDIALOG:+-X}
	fi

done

return $SUCCESS

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