#!/bin/sh

SELF="${0##*/}"

if [ -z "$TMPDIR" ]; then
  TMPDIR=/tmp
elif [ -d "${TMPDIR}/volatile" ]; then
  TMPDIR="${TMPDIR}/volatile"
fi
export TMPDIR
TMPDIR=$(mktemp -dp "$TMPDIR" mutt.XXXXXXXXXX)

cleanup() {
  cd /
  echo Cleaning up $TMPDIR… >> $TMPDIR/output.stderr
  notify_output
  rm -rf "$TMPDIR"
  trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
}
trap cleanup 1 2 3 4 5 6 7 8 10 11 12 13 14 15

cd "$TMPDIR"

notify() {
  if [ -x "$(command -v awesome-client)" ]; then
    awesome-client <<-_eof
	local naughty = require("naughty")
	naughty.notify({ preset = naughty.config.presets.low,
		title  = "$3",
		text   = [[stdout:
		$(sed -e 's,\",\\\",g' "$1")
		stderr:
		$(sed -e 's,\",\\\",g' "$2")]]
		})
	_eof
  fi
}

notify_output() {
  if [ -s "$TMPDIR/output.stdout" ] || [ -s "$TMPDIR/output.stderr" ]; then
    notify $TMPDIR/output.stdout $TMPDIR/output.stderr \
      "Output from mutt/$SELF on $BASENAME"
  fi
}

guess_extension() {
  python -c "import mimetypes; print(mimetypes.guess_extension('$1'))"
}

launch_viewer() {
  run-mailcap --action=view "$1":"$2" > output.stdout 2> output.stderr
}

MIMETYPE="$1"; shift

get_file() {
  local t
  if [ -z "$1" ]; then
    t=$(tempfile -d . -p mutt -s $(guess_extension "$MIMETYPE"))
    cat > "$t"
    echo "$t"
  else
    t="$(echo ${1##*/} | sed -re 's![^[:alnum:],.@%^+=_-]!_!gi')"
    cp "$1" "$t"
    echo "$t"
  fi
}

case "$SELF" in
  (bgrun)
    # make a copy of the file, then launch a shell process in the background
    # to divert to run-mailcap, after which the temporary directory gets
    # cleaned up.
    FILE="$(get_file "${1:-}")"
    (
      launch_viewer "$MIMETYPE" "$FILE"
      sleep 1
      cleanup
    ) &
    trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
    ;;
  (bgrun-fifo)
    # hack to stay around until the viewer has read the file: make a fifo and
    # wait for the cat process to finish writing to it, which means that it
    # must have been consumed on the other end.
    FILE="$(get_file "${1:-}")"
    FIFO="${FILE%/*}/fifo-${FILE##*/}"
    mkfifo "$FIFO"
    cat "$FILE" > "$FIFO" &
    # For some reason, we do have to write a tempfile and cannot seem to
    # redirect stdin directly to the fifo, i.e. this does not work instead of
    # the previous three lines:
    ## cat > "$FIFO" &
    launch_viewer "$MIMETYPE" "${FIFO}"
    wait
    cleanup
    ;;
  (bgrun-delay)
    # hack to stay around for a fixed period of time after the viewer process
    # returns control to the caller, so that we can clean up. This is for
    # cases when the FIFO method doesn't work, because e.g. Firefox randomly
    # chooses it needs to read HTML files twice.
    FILE="$(get_file "${1:-}")"
    (launch_viewer "$MIMETYPE" "${FILE}") &
    (
      sleep 1m
      echo Cleaning up $TMPDIR… > $TMPDIR/output.stderr
      cleanup
    ) &
    trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
    ;;
esac