#!/bin/sh
set -eu

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

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

PAUSETIME=10

HAM=0
SPAM=0
MAILDIR=

for i in "$@"; do
  case "$i" in
    --ham) HAM=1;;
    --spam) SPAM=1;;
    *)
      if [ -n "$MAILDIR" ]; then
        echo "E: Maildir already specified: $i" >&2
        exit 1
      elif [ -d "$i"/cur ] && [ -d "$i"/new ] && [ -d "$i"/tmp ]; then
        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

LOCKFILE="$MAILDIR/.retrain.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 retrain process is already running over that Maildir." >&2
  exit 1
fi

find $MAILDIR/cur $MAILDIR/new -type f | while read msg; 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

rm -f "$LOCKFILE"
trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15

exit 0