#!/bin/sh
set -eu

usage() {
	cat <<-'EOF'
		Usage:
		  msg [-0|-1] [-X|-s|-S|-m|-D|-b] [MESSAGE]
		  msg -h
	EOF
}

help() {
	cat <<-'EOF'


		Options:
		  -X            send MESSAGE using the xmpp(1) command
		  -s            play(1) $XDG_DATA_HOME/msg/{good,bad}.ogg sound
		  -S            say MESSAGE using speak(1)
		  -m            send email(1) with MESSAGE as subject and empty body
		  -D            send desktop MESSAGE via notify-send(1)
		  -b            print terminal bell
		  -0            an OK message
		  -1            an error message
		  -h, --help    show this message

		  MESSAGE       the text to be sent by the relevant channel


		Send MESSAGE via all the selected channels.


		Examples:

		  Ring a terminal bell and play a sound, representing an error:

		    $ msg -1sb


		  Send an email and an XMPP message:

		    $ msg -mX 'The message goes here'
	EOF
}

for flag in "$@"; do
	case "$flag" in
		(--)
			break
			;;
		(--help)
			usage
			help
			exit
			;;
		(*)
			;;
	esac
done

sound() {
	if [ "$OK" = true ]; then
		play "$XDG_DATA_HOME"/msg/good.ogg 2>/dev/null
	else
		play "$XDG_DATA_HOME"/msg/bad.ogg 2>/dev/null
	fi
}

OK=true
XMPP=false
SOUND=false
SPEAK=false
MAIL=false
DESKTOP=false
BELL=false
ACTION_DONE=false
while getopts '01XsSmDbh' flag; do
	case "$flag" in
		0)
			OK=true
			;;
		1)
			OK=false
			;;
		X)
			XMPP=true
			ACTION_DONE=true
			;;
		(s)
			SOUND=true
			ACTION_DONE=true
			;;
		S)
			SPEAK=true
			ACTION_DONE=true
			;;
		(m)
			MAIL=true
			ACTION_DONE=true
			;;
		D)
			DESKTOP=true
			ACTION_DONE=true
			;;
		(b)
			BELL=true
			ACTION_DONE=true
			;;
		(h)
			usage
			help
			exit
			;;
		(*)
			usage >&2
			exit 2
			;;
	esac
done
shift $((OPTIND - 1))

if [ "$ACTION_DONE" = false ]; then
	sound
	usage
	help
	exit
fi


MESSAGE="${1:-}"

if [ "$XMPP" = true ]; then
	eval "$(assert-arg -- "$MESSAGE" '-X MESSAGE')"
	xmpp -m "$MESSAGE" eu@euandre.org &
fi
if [ "$SOUND" = true ]; then
	sound &
fi
if [ "$SPEAK" = true ]; then
	eval "$(assert-arg -- "$MESSAGE" '-S MESSAGE')"
	printf '%s\n' "$MESSAGE" | speak -v pt-BR &
fi
if [ "$MAIL" = true ]; then
	eval "$(assert-arg -- "$MESSAGE" '-m MESSAGE')"
	echo " " | email -s "$MESSAGE" eu@euandre.org &
fi
if [ "$DESKTOP" = true ]; then
	eval "$(assert-arg -- "$MESSAGE" '-D MESSAGE')"
	if [ "$OK" = true ]; then
		notify-send -t 5000             "$MESSAGE" &
	else
		notify-send -t 5000 -u critical "$MESSAGE" &
	fi
fi
if [ "$BELL" = true ]; then
	printf '\a' &
fi

wait
