#!/bin/sh
set -eu

NICE='/usr/bin/nice -20'
NICE=''

RESUBMIT="$NICE $HOME/.etc/mailfilter/bin/resubmit"

PAUSETIME=10

HAM=0
SPAM=0

maildir=
files=
for i in "$@"; do
  case "$i" in
    --ham) HAM=1;;
    --spam) SPAM=1;;
    *)
      if [ -f "$i" ] && [ -r "$i" ]; then
        files="$files $i"
      elif [ -d "$i"/cur ] && [ -d "$i"/new ] && [ -d "$i"/tmp ]; then
        if [ -n "$maildir" ]; then
          echo "E: Maildir already specified: $i" >&2
          exit 1
        fi
        maildir="$i"
      else
        echo "E: unknown argument: $i" >&2
        exit 255
      fi
      ;;
  esac
done

ARG=
case "$HAM/$SPAM" in
  0/0)
    echo "E: you need to specify either --ham or --spam." >&2
    exit 255
    ;;
  1/1)
    echo "E: you cannot specify both --ham and --spam." >&2
    exit 255
    ;;
  0/1) ARG=--spam;;
  1/0) ARG=--ham;;
esac

if [ -n "$maildir" ]; then
  ME="${0##*/}"
  LOCKFILE="$maildir/.$ME.lock"
  trap "rm -f $LOCKFILE" 1 2 3 4 5 6 7 8 10 11 12 13 14 15
  if ! lockfile -0 -r0 -l 3600 "$LOCKFILE" 2>/dev/null; then
    echo "E: another $ME process is already running over that Maildir." >&2
    exit 1
  fi

  files="$files $(find $MAILDIR/cur $MAILDIR/new -type f)"
fi

for msg in $files; do
  $NICE ${0%/*}/train $ARG "$msg" | $RESUBMIT || ret=$?
  case "${ret:-0}" in
    0|75) :;;
    *)
      echo "E: resubmission returned with exit code $ret" >&2
      continue
      ;;
  esac
  rm -f "$msg"
  sleep $PAUSETIME
done

if [ -n "${LOCKFILE:-}" ]; then
  rm -f "$LOCKFILE"
  trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
fi

exit 0