#!/usr/bin/env bash
# termprogress -- update the terminal window "progress" indicator
#
# Currently supported by ConEmu and Windows Terminal.

readonly Remove=0
readonly Normal=1
readonly Error=2
readonly Indeterminate=3
readonly Paused=4

usage() {
	echo "Usage: ${0##*/} [-p] [-e] <percent>"
	echo "       ${0##*/} -i"
	echo "       ${0##*/} -r"
	echo ""
	echo "Update the terminal's \"progress\" indicator."
	echo ""
	echo "Options:"
	echo "  -p            indicate 'paused' state"
	echo "  -e            indicate 'error' state"
	echo "  -i            indeterminate progress"
	echo "  -r            remove all indicators"
}

mode=
value=

while getopts "eipr" OPT; do
	case $OPT in
	e) mode=$Error;;
	i) mode=$Indeterminate;;
	p) mode=$Paused;;
	r) mode=$Remove;;
	*) usage; exit 2;;
	esac
done; shift $((OPTIND-1))

if [[ $1 ]]; then
	if ! [[ $1 =~ ^([[:digit:]]{1,2}|100)$ ]]; then
		echo "${0##*/}: value must be an integer [0-100]" >&2
		exit 2
	fi
	mode=${mode:-$Normal}
	value=$1
	if (( mode == Indeterminate || mode == Remove )); then
		echo "${0##*/}: progress value ignored in this mode" >&2
	fi
else
	if [[ ! $mode ]]; then
		echo "${0##*/}: neither state nor value provided" >&2
		exit 2
	elif (( mode == Normal || mode == Paused || mode == Error )); then
		echo "${0##*/}: progress value required in this mode" >&2
		exit 2
	fi
fi

printf '\e]9;4;%d;%d\e\\' "$mode" "$value"
