#!/usr/bin/env bash

__test_yesno() {
	if yesno "Yes, or No?"; then
		msgbox "User selected yes."
	else
		msgbox "User selected no."
	fi
}

__test_msgbox() {
	msgbox "A msgbox."
	msgbox "An error msgbox." "$RTUI_PALETTE_ERROR"
}

__test_inputbox() {
	local item
	if item=$(inputbox "Say something." "Like this."); then
		msgbox "User said '$item'."
	else
		msgbox "User cancelled action."
	fi
}

__test_passwordbox() {
	local item
	if item=$(passwordbox "Tell me a secret."); then
		msgbox "User said '$item'."
	else
		msgbox "User cancelled action."
	fi
}

__test_gauge() {
	for i in {0..5}; do
		echo $((i * 20))
		sleep 1
	done | gauge "Let's go!" 0
}

__test_infobox() {
	infobox "An infobox. Control is returned to the function for background task..."
	sleep 5
	msgbox "Work is done."
}

__test_show_once() {
	if ! show_once DIALOG_TEST_SHOW_ONCE yesno "First time here?"; then
		msgbox "It's a lie."
		return
	fi
	msgbox "Hi again."
}

__test_checklist() {
	checklist_init
	checklist_add "Item 1" "OFF" "Value 1"
	checklist_add "Item 2" "ON" "Value 1"
	checklist_add "Item 3" "OFF" "Value 1"
	if checklist_show "Checklist"; then
		local titles=() values=() selection="'${RTUI_CHECKLIST_STATE_NEW[*]}'"
		for i in "${RTUI_CHECKLIST_STATE_NEW[@]}"
		do
			titles+=("$(checklist_gettitle "$i")")
			values+=("$(checklist_getitem "$i")")
		done

		if checklist_is_selection_empty; then
			selection="nothing"
		fi
		msgbox "Offered '${RTUI_CHECKLIST_STATE_OLD[*]}', selected $selection.
Titles: '${titles[*]}'
Values: '${values[*]}'"
	else
		msgbox "User cancelled action."
	fi
}

__test_radiolist() {
	radiolist_init
	radiolist_add "Item 1" "OFF"
	radiolist_add "Item 2" "OFF"
	radiolist_add "Item 3" "OFF"
	if radiolist_show "Radiolist"; then
		local selection="'${RTUI_RADIOLIST_STATE_NEW[*]}'"
		if radiolist_is_selection_empty; then
			selection="nothing"
		fi
		msgbox "Offered '${RTUI_RADIOLIST_STATE_OLD[*]}', selected $selection."
	else
		msgbox "User cancelled action."
	fi
}

__test_fselect() {
	local item
	if item=$(fselect "$PWD"); then
		msgbox "User selected file '$item'."
	else
		msgbox "User cancelled action."
	fi
}

__test_dselect() {
	local item
	if item=$(dselect "$PWD"); then
		msgbox "User selected folder '$item'."
	else
		msgbox "User cancelled action."
	fi
}

__test_color_picker() {
	local rgb=()

	mapfile -t rgb < <(color_picker)

	if ((${#rgb[@]} != 0)); then
		msgbox "User selected color '${rgb[*]}'."
	else
		msgbox "User cancelled action."
	fi
}

__test_menu_select_handler() {
	msgbox "You selected '$RTUI_MENU_SELECTED', index = $RTUI_MENU_SELECTED_INDEX."
}

__test_menu() {
	menu_init
	menu_add __test_menu_select_handler "A"
	menu_add __test_menu_select_handler "B"
	menu_add __test_menu_select_handler "C"
	menu_show "Menu tests"
}

__test_custom_menu() {
	while true; do
		menu_init
		menu_add __test_menu_select_handler "A"
		menu_add __test_menu_select_handler "B"
		menu_add __test_menu_select_handler "C"
		if menu_call "Custom menu tests"; then
			msgbox "Menu selected, and callback processed."
		else
			msgbox "Menu cancelled."
			break
		fi
	done
}

__test() {
	menu_init
	menu_add __test_menu "menu"
	menu_add __test_custom_menu "custom menu"
	menu_add_separator
	menu_add __test_yesno "yesno"
	menu_add __test_msgbox "msgbox"
	menu_add __test_inputbox "inputbox"
	menu_add __test_passwordbox "passwordbox"
	menu_add __test_gauge "gauge"
	menu_add __test_infobox "infobox"
	menu_add_separator
	menu_add __test_show_once "show_once yesno"
	menu_add_separator
	menu_add __test_checklist "checklist"
	menu_add_separator
	menu_add __test_radiolist "radiolist"
	menu_add_separator
	menu_add __test_fselect "fselect"
	menu_add __test_dselect "dselect"
	menu_add_separator
	menu_add __test_color_picker "color_picker"
	menu_show "TUI tests"
}

main() {
	set -euo pipefail
	shopt -s nullglob

	LC_ALL="C"
	LANG="C"
	LANGUAGE="C"

	DEBUG="${DEBUG:-false}"

	local SCRIPT_DIR
	SCRIPT_DIR="$(dirname "$(realpath "$0")")"
	if [[ -f "$SCRIPT_DIR/../src/lib/librtui/tui.sh" ]]; then
		# shellcheck source=src/tui.sh
		source "$SCRIPT_DIR/../src/lib/librtui/tui.sh"
	else
		# shellcheck source=src/tui.sh
		source "/usr/lib/librtui/tui.sh"
	fi

	tui_start __test "RTUI TEST"
}

main "$@"
