#!/bin/bash

set -o errexit
set -o nounset
set -o pipefail

# Put your email address here:
declare RECIPIENT="me@example.com"

declare CONTENT_PATH=""

function show_help ()
{
   cat >&2 <<EOF
usage: $(basename $0) [OPTION...] SUBJECT TIMESPEC

Compose an email for sending at a later time.  The text of the email
is a brief message automatically generated, or you can use '-f' to
specify the text.

OPTIONS
  -r ADDR  Recipient, defaults to '$RECIPIENT'.
  -f PATH  File containing the text of the mail.
       Use "-f -" to type the text when prompted.
  -v   Verbosity.  Repeat for more verbosity.
  -h   This help.

TIMESPEC
   A time or datetime as understood by at(1).

Examples
   \$ $(basename $0) "Buy milk" now + 12 hours
   \$ $(basename $0) "Sell butter" 09:30 2030-04-01
EOF
   exit 1
}
#------------------------------------------------------------------------------

declare -i VERBOSITY=0
while getopts ":hr:f:v" opt
do
   case $opt in
       r ) RECIPIENT="$OPTARG" ;;
       f ) CONTENT_PATH="$OPTARG" ;;
       v ) ((++VERBOSITY)) ;;
       * ) show_help ;;
   esac
done
shift $(($OPTIND - 1))
#------------------------------------------------------------------------------

function squawk ()
{
    local -i NVOL=$1; shift
    if ((NVOL <= VERBOSITY)); then
        echo $(basename $0) "$@"
    fi
}
#------------------------------------------------------------------------------

squawk 1 "started."

if (($# < 2)); then
    show_help
fi

declare -r SUBJECT="$1"; shift
# This is for easier grepping of the 'at' job file:
declare -x XAT_Subject="$SUBJECT"

declare -r TMPFILE=$(mktemp /var/tmp/email-at.XXXX)
squawk 1 "TMPFILE is $TMPFILE"

if [[ -z "$CONTENT_PATH" ]]; then
    cat > "$TMPFILE" <<EOF
Generated by $(basename $0) on $(date "+%F %a %T %Z").
--
Donym
EOF
elif [[ "-" == "$CONTENT_PATH" ]]; then
   echo "Type your message here, ending with ctrl-d."
   cat >$TMPFILE
   # Is it empty?
   declare -i TMPSZ=$(stat --format='%s' $TMPFILE)
   squawk 1 "Size of TMPFILE is $TMPSZ bytes"
   if ((0 == TMPSZ)); then
      echo >&2 "No content, aborting"
      exit 1
   fi
else
    squawk 1 "Looking for contents in '$CONTENT_PATH'..."
    if ! [[ -f "$CONTENT_PATH" && -r "$CONTENT_PATH" ]]; then
        echo >&2 "'$CONTENT_PATH': not found or unreadable."
        exit 1
    fi
    squawk 1 "Found '$CONTENT_PATH'."
    cp "$CONTENT_PATH" "$TMPFILE"
fi

squawk 1 "Sub $SUBJECT; Rec $RECIPIENT; time $@"
at $@ -f <(cat <<EOF0
bash -s <<EOF1
set -o errexit
mutt -s "$SUBJECT" "$RECIPIENT" < "$TMPFILE"
rm "$TMPFILE"
EOF1
EOF0
)

squawk 1 "done."

exit 0
