
#!/bin/sh
# File	: proc_mail-subjects.sh
# By	: MaartenDeBoer.nl, 210615
# Subject	: Script to process mail subjects for later reminders
#(0.2)	: Add AFTER_1DAT, _1WEEK, _1MONTH
#(0.3)	: ADD -d & rearnge options
#(0.4),210617	: Add commands after " } " (space before & after {) in subject, add more after's
#(0.5),210705	: Mod.  if [ ! ${CHECK} ] && [ "${FROM}" = "" ]; then
#(0.6),210906	: Add remove
#(0.7),210907	: Add done
#(0.8),210920	: Mod help)
#(0.9).211125	: Add --after_4week .. --after_6week
#(0.10),211208	: Mod. evenry mail-address its own data-file (SUBJECTS_DIR, DONE_DIR)
#(0.11),211214	: Mod of DATA-files (grep -v "__")
#(0.12),220103	: Add -li (--list) for send list to -f (--from)
#(0.13),220106	: Add `grep "^[2-9][0-9][0-9][0-9]"` atd done) 
#(0.14),220111	: Add (cmd) search
PGM=`basename $0|cut -d\. -f1`
VER="0.14"
TMP="/tmp/${PGM}.$$"
LOG="${HOME}/log/${PGM}.log"
HOSTNAME=`hostname|cut -d\. -f1`

DATA_DIR="${HOME}/data"
SUBJECTS_DIR="${DATA_DIR}/subjects"
DONE_DIR="${DATA_DIR}/done"
SUBJECT=""
CHECK=""
MAIL=""
COMMAND=""
FROM=""
DATI=`date +%Y-%m-%d-%H-%M-%S`
SEND_LIST=""

USAGE()
{
  echo "Usage: ${PGM} <options>"
  echo "  Version: ${VER}"
  echo "  options               :"
  echo "    -h | --help         : this help"
  echo "    -s | --subject      : Subject"
  echo "    -f | --from         : From"
  echo "    -d | --date         : Date (yyyy-mm-dd)"
  echo "    -l | --list         : List (-f | --from needed)"
  echo "    -m | --mail         : Mail"
  echo "    --after_1day        : check subjects from 1 day old"
  echo "    --after_1week       : check subjects from 1 week old"
  echo "    --after_2week       : check subjects from 2 weeks old"
  echo "    --after_3week       : check subjects from 3 weeks old"
  echo "    --after_4week       : check subjects from 4 weeks old"
  echo "    --after_5week       : check subjects from 5 weeks old"
  echo "    --after_6week       : check subjects from 6 weeks old"
  echo "    --after_1month      : check subjects from 1 month old"
  echo "    --after_2month      : check subjects from 2 months old"
  echo "    --after_3month      : check subjects from 3 months old"
  echo "    --after_6month      : check subjects from 6 months old"
  echo "    -V                  : Version"
  echo "    -x                  : set -x"
}
if [ ${#} -lt 1 ]; then
  echo "  Do NOT know what to do. Exiting ..."
  USAGE
  exit 1
fi
while [ ${#} -ge 1 ]
  do
  case ${1} in
    -h | --help) USAGE; exit 1 ;;
    -s | --subject) SUBJECT=${2}; shift ;;
    -f | --from) FROM=${2}; shift ;;
    -l | --list) SEND_LIST=1 ;;
    --after_1day) CHECK=1;NEW_DATE="-1 day" ;;
    --after_1week) CHECK=1;NEW_DATE="-1 week" ;;
    --after_2week) CHECK=1;NEW_DATE="-2 week" ;;
    --after_3week) CHECK=1;NEW_DATE="-3 week" ;;
    --after_4week) CHECK=1;NEW_DATE="-4 week" ;;
    --after_5week) CHECK=1;NEW_DATE="-5 week" ;;
    --after_6week) CHECK=1;NEW_DATE="-6 week" ;;
    --after_1month) CHECK=1;NEW_DATE="-1 month" ;;
    --after_2month) CHECK=1;NEW_DATE="-2 month" ;;
    --after_3month) CHECK=1;NEW_DATE="-3 month" ;;
    --after_6month) CHECK=1;NEW_DATE="-6 month" ;;
    -d | --date) CHECK=1;NEW_DATE="${2}"; shift ;;
    -m | --mail) MAIL=1 ;;
    -V) echo "${PGM}: v${VER}"; exit 2 ;;
    -x)  set -x ;;
    *)  echo "Option ${1} not known."; USAGE; exit 1 ;;
  esac
    shift
done

echo "`date` ${PGM} v${VER} started."|tee -a ${LOG}
touch ${TMP}

if [ ! -d ${DATA_DIR} ]; then
  mkdir ${DATA_DIR}
  echo "  Dir. ${DATA_DIR} created."|tee -a ${LOG}
fi
# When CHECK=1, then no FROM is needed.
if [ ! ${CHECK} ] && [ "${FROM}" = "" ]; then
  echo "  NO FROM-address ($FROM}). So, no idea to answer to. Exiting ..."|tee -a ${LOG}
  exit 3
fi

# Check if " } " is in the SUBJECT. Then is COMMAND. And NOT to be stored
ANSW=`echo ${SUBJECT}|grep ' } '`
# When a CMD (in ANSW) and a FROM-address
if [ "${ANSW}" != "" ] && [ "${FROM}" != "" ]; then
  COMMAND=`echo ${SUBJECT}|cut -d\} -f2|tr [:upper:] [:lower:]|sed 's/ //g'`
  echo "  COMMAND=${COMMAND}"|tee -a ${LOG}
  case ${COMMAND} in
# ----------------
    help)
      echo "${PGM} v${VER} commands:" > ${TMP}
      echo "  help : this help." >> ${TMP}
      echo "  list : a list of subjects from you." >> ${TMP}
      echo "  done : marking a subject as done." >> ${TMP}
      echo "  remove : removing a subject as done." >> ${TMP}
      echo "  search : search for a subject." >> ${TMP}
      echo "" >> ${TMP}
      cat ${TMP}| mailx -s "Reminder commands. [${PGM} v${VER}]" ${FROM}
      echo "  Mailed commands to ${FROM}"|tee -a ${LOG}
      cp /dev/null ${TMP}
    ;;
#
# ----------------
    search)
      echo "search for:" > ${TMP}
# Get (search) subject from before }
# Remove last space (' $') and FW: & RE:
      S_SUBJECT=`echo ${SUBJECT}|grep "\} search"|cut -d\} -f1|sed 's/ $//'|sed 's/FW: //g'|sed 's/RE: //g'`
      echo "    |${S_SUBJECT}|"|tee -a ${LOG} ${TMP}
      if [ "${S_SUBJECT}" != "" ]; then
        grep -i "${S_SUBJECT}" "${SUBJECTS_DIR}/${FROM}" >> ${TMP}
        echo "" >> ${TMP}
        echo "`date` by ${PGM} v${VER} at ${HOSTNAME}" >> ${TMP}
        cat ${TMP}| mailx -s "Searched list subjects list. [${PGM} v${VER}]" ${FROM}
        echo "  Mailed list to ${FROM}"|tee -a ${LOG}
        cp /dev/null ${TMP}
      fi  # S_SUBJECT}" != ""
    ;;
#
# ----------------
    done)
      echo "done:" > ${TMP}
      cp "${SUBJECTS_DIR}/${FROM}" "${SUBJECTS_DIR}/${FROM}__${DATI}"
      LINE=`echo ${SUBJECT}|awk -F\} '{print $1}'|sed 's/FW: //g'|sed 's/RE: //g'|sed 's/ $//g'`
      echo "    |${LINE}|"|tee -a ${LOG} ${TMP}
      cat "${SUBJECTS_DIR}/${FROM}"|grep "${LINE}"|sort -u >> "${DONE_DIR}/${FROM}"
      cat "${SUBJECTS_DIR}/${FROM}__${DATI}"|grep -v "${LINE}"|grep "^[2-9][0-9][0-9][0-9]"|sort -u > "${SUBJECTS_DIR}/${FROM}"
# send list to
      echo "list:" >> ${TMP}
      echo "date        | subject" >> ${TMP}
      cat "${SUBJECTS_DIR}/${FROM}"|sort| while read LINE
      do
        LIST_DATE=`echo ${LINE}|awk -F\; '{print $1}'|cut -d\- -f1-3`
        LIST_SUBJ=`echo ${LINE}|awk -F\; '{print $3}'`
        echo "${LIST_DATE} | ${LIST_SUBJ}" >> ${TMP}
      done
      echo "" >> ${TMP}
      echo "`date` by ${PGM} v${VER} at ${HOSTNAME}" >> ${TMP}
      cat ${TMP}| mailx -s "Reminder subjects list. [${PGM} v${VER}]" ${FROM}
      echo "  Mailed list to ${FROM}"|tee -a ${LOG}
      cp /dev/null ${TMP}
    ;;
# ----------------
    remove)
      echo "remove:" > ${TMP}
      cp "${SUBJECTS_DIR}/${FROM}" "${SUBJECTS_DIR}/${FROM}__${DATI}"
#      LINE=`echo ${SUBJECT}|cut -d\} -f1|sed 's/FW: //g'|sed 's/RE: //g'|sed 's/ $//g'`
      LINE=`echo ${SUBJECT}|awk -F\} '{print $1}'|sed 's/FW: //g'|sed 's/RE: //g'|sed 's/ $//g'`
      echo "    |${LINE}|"|tee -a ${LOG} ${TMP}
      cat "${SUBJECTS_DIR}/${FROM}__${DATI}"|grep -v "${LINE}"|sort -u > "${SUBJECTS_DIR}/${FROM}"
# send list to
      echo "list:" >> ${TMP}
      echo "date        | subject" >> ${TMP}
      cat "${SUBJECTS_DIR}/${FROM}"|sort| while read LINE
      do
        LIST_DATE=`echo ${LINE}|awk -F\; '{print $1}'|cut -d\- -f1-3`
        LIST_SUBJ=`echo ${LINE}|awk -F\; '{print $3}'`
        echo "${LIST_DATE} | ${LIST_SUBJ}" >> ${TMP}
      done
      echo "" >> ${TMP}
      echo "`date` by ${PGM} v${VER} at ${HOSTNAME}" >> ${TMP}
      cat ${TMP}| mailx -s "Reminder subjects list. [${PGM} v${VER}]" ${FROM}
      echo "  Mailed list to ${FROM}"|tee -a ${LOG}
      cp /dev/null ${TMP}
    ;;

# ----------------
# List ONLY from the FROM-address
    list) 
      echo "list:" > ${TMP}
      echo "date        | subject" >> ${TMP}
      cat "${SUBJECTS_DIR}/${FROM}"|sort| while read LINE
      do
        LIST_DATE=`echo ${LINE}|awk -F\; '{print $1}'|cut -d\- -f1-3`
        LIST_SUBJ=`echo ${LINE}|awk -F\; '{print $3}'`
        echo "${LIST_DATE} | ${LIST_SUBJ}" >> ${TMP}
      done
      echo "" >> ${TMP}
      echo "`date` by ${PGM} v${VER} at ${HOSTNAME}" >> ${TMP}
      cat ${TMP}| mailx -s "Reminder subjects list. [${PGM} v${VER}]" ${FROM}
      echo "  Mailed list to ${FROM}"|tee -a ${LOG}
      cp /dev/null ${TMP}
    ;;
#
# ----------------
    *)
     echo "  Wrong command (${COMMAND}). Mailed this to ${FROM}."|tee -a ${LOG}| mailx -s "Wrong command. [${PGM} v${VER}]" ${FROM}
     ;;
  esac
fi

# If NO COMMAND then store
# Every FROM its own DATA-file
if [ "${COMMAND}" = "" ] && [ "${SUBJECT}" != "" ] && [ "${FROM}" != "" ]; then
  DATI=`date +%Y-%m-%d-%H-%M-%S`
  SUBJECT2=`echo ${SUBJECT}|sed 's/FW: //g'|sed 's/RE: //g'` 
  echo "${DATI};${FROM};${SUBJECT}" >> "${SUBJECTS_DIR}/${FROM}"
fi

if [ ${CHECK} ]; then
  CHK_DATE=`date --date="${NEW_DATE}" +%Y-%m-%d`
  echo "  Checking from ${CHK_DATE}"|tee -a ${LOG}
  cd ${SUBJECTS_DIR}
  grep "^${CHK_DATE}" * |grep -v "__" |while read LINE
  do
    DATI=`echo ${LINE}|cut -d\: -f2-|awk -F\; '{print $1}'`
    MAILTO=`echo ${LINE}|cut -d\: -f2-|awk -F\; '{print $2}'`
    MAILSUBJ=`echo ${LINE}|cut -d\: -f2-|awk -F\; '{print $3}'`
    DATI2=`echo ${DATI}|awk -F\- '{print $1"-"$2"-"$3" "$4":"$5":"$6}'`
    HUMAN_DATE=`date --date="${DATI2}" `
    echo "  Subj:${MAILSUBJ} To:${MAILTO}"
    if [ ${MAIL} ]; then
      echo "Reminder for \"${MAILSUBJ}\" from ${HUMAN_DATE} (${DATI})  [${PGM} v${VER}]" | mailx -s "${MAILSUBJ}" ${MAILTO}
      echo "  Send mail to ${MAILTO} about ${MAILSUBJ}"|tee -a ${LOG}
    fi  # {MAIL}
  done
fi  # CHECK

# Send List
if [ ${SEND_LIST} ] && [ "${FROM}" != "" ]; then
  echo "  Sending list to ${FROM}"|tee -a ${LOG}
      echo "list:" > ${TMP}
      echo "date        | subject" >> ${TMP}
      cat "${SUBJECTS_DIR}/${FROM}"|sort| while read LINE
      do
        LIST_DATE=`echo ${LINE}|awk -F\; '{print $1}'|cut -d\- -f1-3`
        LIST_SUBJ=`echo ${LINE}|awk -F\; '{print $3}'`
        echo "${LIST_DATE} | ${LIST_SUBJ}" >> ${TMP}
      done
      echo "" >> ${TMP}
      echo "`date` by ${PGM} v${VER} at ${HOSTNAME}" >> ${TMP}
      cat ${TMP}| mailx -s "Reminder subjects list. [${PGM} v${VER}]" ${FROM}
      echo "  Mailed list to ${FROM}"|tee -a ${LOG}
      cp /dev/null ${TMP}

fi  # SEND_LIST

rm ${TMP}
echo "`date` ${PGM} v${VER} finished."|tee -a ${LOG}
exit 0

