#!/bin/sh
# SPDX-License-Identifier: AGPL-3.0-only
# Copyright 2022 Sxmo Contributors

# include common definitions
# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh
. sxmo_hook_icons.sh
# shellcheck source=scripts/core/sxmo_common.sh
. sxmo_common.sh

confirm() {
	PICKED="$(printf "Yes\nNo\n" | sxmo_dmenu.sh -p "Confirm $1")"

	if [ "$PICKED" = "Yes" ]; then
		return 0
	else
		return 1
	fi
}

supertoggle_daemon() {
	if superctl status "$1" | grep -q started; then
		superctl stop "$1"
		sxmo_notify_user.sh "$1 Stopped"
	else
		superctl start "$1"
		sxmo_notify_user.sh "$1 Started"
	fi

}

toggle_daemon() {
	name="$1"
	shift

	if sxmo_daemons.sh running "$1" -q; then
		sxmo_daemons.sh stop "$@"
		notify-send "$name Stopped"
	else
		sxmo_daemons.sh start "$@" &
		notify-send "$name Started"
	fi
}

sxmo_type() {
	sxmo_type.sh -s 200 "$@" # dunno why this is necessary but it sucks without
}

call_entries() {
	shown_incall_menu=
	sxmo_modemcall.sh list_active_calls | while read -r line; do
		case "$line" in
			*"(ringing-in)")
				CALLID="$(printf %s "$line" | cut -d" " -f1 | xargs basename)"
				NUMBER="$(sxmo_modemcall.sh vid_to_number "$CALLID")"
				CONTACT="$(sxmo_contacts.sh --name "$NUMBER")"

				printf "%s Incoming call %s ^ 0 ^ sxmo_daemons.sh start incall_menu sxmo_modemcall.sh incoming_call_menu %s\n" \
					"$icon_phn" "$CONTACT" "$CALLID"
				;;
			*)
				[ -n "$shown_incall_menu" ] && continue
				shown_incall_menu=1
				printf "%s Incall Menu ^ 0 ^ sxmo_daemons.sh start incall_menu sxmo_modemcall.sh incall_menu\n" \
					"$icon_phn"
				;;
		esac
	done

}

getprogchoices() {
	RES="$(sxmo_hook_contextmenu.sh "$1")"
	if [ -n "$RES" ]; then
		WINNAME="$(printf %s "$RES" | head -n1)"
		CHOICES="$(printf %s "$RES" | tail -n+2)"
	fi

	# For the Sys menu decorate at top with notifications if >1 notification
	if [ "$WINNAME" = "Sys" ]; then
		NNOTIFICATIONS="$(find "$SXMO_NOTIFDIR" -type f | wc -l)"
		if [ "$NNOTIFICATIONS" -gt 0 ]; then
			CHOICES="
				$icon_bel Notifications ($NNOTIFICATIONS) ^ 0 ^ sxmo_notificationsmenu.sh
				$CHOICES
			"
		fi
	fi

	CHOICES="
		$(call_entries)
		$CHOICES
	"

	# Decorate menu at bottom w/ system menu entry if not system menu
	echo "$WINNAME" | grep -qv Sys && CHOICES="
		$CHOICES
		$icon_mnu System Menu   ^ 0 ^ sxmo_appmenu.sh sys
	"

	# Decorate menu at bottom w/ close menu entry
	CHOICES="
		$CHOICES
		$icon_cls Close Menu    ^ 0 ^ quit
	"

	CHOICES="$(printf "%s\n" "$CHOICES" | xargs -0 echo | sed '/^[[:space:]]*$/d' | awk '{$1=$1};1')"
}

quit() {
	exit 0
}

mainloop() {
	getprogchoices "$@"
	PICKED="$(
		printf "%s\n" "$CHOICES" |
		cut -d'^' -f1 |
		sxmo_dmenu.sh -i -p "$WINNAME"
	)" || quit

	CHOICE="$(echo "$CHOICES" | awk -F '^' -v picked="$PICKED" \
		'$1 == picked {print $2 "^" $3}'
	)"

	LOOP="$(echo "$CHOICE" | cut -d '^' -f1)"
	CMD="$(echo "$CHOICE" | cut -d '^' -f2)"

	if [ -z "$CMD" ]; then
		printf "%s\n" "sxmo_appmenu: Fallback: unknown choice <$PICKED> to contextmenu_fallback hook">&2
		sxmo_hook_contextmenu_fallback.sh "$WINNAME" "$PICKED"
		quit
	fi

	printf 'sxmo_appmenu: Eval: <%s> from picked <%s> with loop <%s>\n' \
		"$CMD" "$PICKED" "$LOOP" >&2

	if printf %s "$LOOP" | grep -q 1; then
		eval "$CMD"
		mainloop "$@"
	else
		eval "$CMD"
		quit
	fi
}

# Allow loading from shellspec
if [ -z "$SHELLSPEC_PATH" ]; then
	mainloop "$@"
fi
