#!/bin/sh



#variables
BSDDIALOG_OK=0
BSDDIALOG_CANCEL=1
BSDDIALOG_HELP=2
BSDDIALOG_EXTRA=3
BSDDIALOG_TIMEOUT=4
BSDDIALOG_CLOSE=5
BSDDIALOG_CLOSEX=255
GBSDDIALOG_BACKTITLE_LOGO=
PROGNAME="talk.sh"
#executables
GBSDDIALOG="Xdialog"
GBSDDIALOG_OPTIONS="--screen-center --wizard --left --cancel-label Exit"
KILL="kill"


#functions
#display
_display()
{
	$GBSDDIALOG $GBSDDIALOG_OPTIONS \
		--backtitle "$title" --title "$subtitle" \
		"--$dialog" "$text" "$height" "$width"
}


#error
_error()
{
	_reset
	dialog="msgbox"
	title="Error"
	subtitle="Error"
	text="$@"

	_display
	return 2
}


#parse
_parse()
{
	i=0

	_reset
	while [ $i -lt $1 ]; do
		IFS= read line || break
		if [ $asis -ne 0 ]; then
			case "$line" in
				'```')
					asis=0
					;;
			*)
				text="$text
$line"
				;;
			esac
			continue
		fi
		case "$line" in
			"### "*)
				text="
$text

$line"
				;;
			"## "*)
				if [ -z "$subtitle" ]; then
					subtitle="${line#"## "}"
				else
				text="
${text#"## "}

$line"
				fi
				;;
			"# "*)
				if [ -z "$title" ]; then
					title="${line#"# "}"
				else
				text="
${text#"# "}

$line"
				fi
				;;
			"---")
				i=$((i + 1))
				[ $i -eq $1 ] && break
				_reset
				;;
			'```')
				asis=1
				;;
			"* "*)
				text="$text
 ⚫ ${line#"* "}"
				;;
			"  * "*)
				text="$text
    ⚫${line#"  * "}"
				;;
			"1. "*)
				text="$text
$index1) ${line#1. }"
				index1=$((index1 + 1))
				index2=1
				;;
			"   1. "*)
				text="$text
    $index2) ${line#   1. }"
				index2=$((index2 + 1))
				;;
			*)
				text="$text
$line"
				;;
		esac
	done
	if [ $i -le $1 ]; then
		text="$text

Slide $i"
		slide=$i
		return 0
	fi
	return 2
}


#reset
_reset()
{
	dialog="yesno"
	title=
	subtitle=
	text=
	asis=0
	index1=1
	index2=1
}


#setup
_setup()
{
	pid=0

	maxsize=$($GBSDDIALOG --print-maxsize 2>&1)
	[ $? -eq 0 ] || return 2

	maxsize=${maxsize#MaxSize: }
	width=${maxsize#*, }
	height=${maxsize%,*}

	$GBSDDIALOG --backtitle "" --clear-screen &
	pid=$!
	trap "$KILL $pid" SIGINT
	trap "$KILL $pid" SIGTERM
}


#usage
_usage()
{
	echo "Usage: $PROGNAME -s number [filename]" 1>&2
	echo "  -s	Start at a specific slide" 1>&2
	return 1
}


#main
inputfile="/dev/stdin"
slide=1

while getopts "s:" name; do
	case "$name" in
		s)
			slide="$OPTARG"
			;;
		*)
			_usage
			exit $?
			;;
	esac
done
shift $((OPTIND - 1))
if [ $# -eq 1 ]; then
	inputfile="$1"
	[ -f "${inputfile%.md}.css" ] &&
		GBSDDIALOG_OPTIONS="$GBSDDIALOG_OPTIONS --rc-file ${inputfile%.md}.css"
	if [ -f "${inputfile%.md}.png" ]; then
		GBSDDIALOG_BACKTITLE_LOGO="${inputfile%.md}.png"
		export GBSDDIALOG_BACKTITLE_LOGO
	fi
else
	_usage
	exit $?
fi

width=0
height=0
_setup

ret=0
while [ $ret -eq 0 ]; do
	_parse $slide < "$inputfile"
	_display
	case $? in
		$BSDDIALOG_CANCEL)
			break
			;;
		$BSDDIALOG_CLOSE|$BSDDIALOG_CLOSEX)
			break
			;;
		$BSDDIALOG_EXTRA)	# Previous
			slide=$((slide - 1))
			[ $slide -ge 1 ] || slide=1
			;;
		$BSDDIALOG_OK)		# Next
			slide=$((slide + 1))
			;;
		130)			# SIGINT
			ret=130
			;;
		*)
			_error "Unknown code $?"
			break
			;;
	esac
done
[ $pid -eq 0 ] || $KILL $pid
exit $ret
