#!/usr/bin/env python3

###################################################################
# To the extent possible under law, the person who associated CC0 #
# with phlog_bot.py has waived all copyright and related or       #
# neighboring rights to phlog_bot.py.                             #
#                                                                 #
# https://creativecommons.org/publicdomain/zero/1.0/              #
###################################################################

# NO WARRANTY!!!!
# PLEASE DON'T RUN THIS SCRIPT UNLESS YOU HAVE BACKUPS OF YOUR
# MAILFILE OR ANYTHING ELSE THIS SCRIPT TOUCHES PLEASE.

import mailbox
import json
import time
import datetime
import os

gopher_dir = "/sdf/arpa/gm/l/lro/test"
userdictionaryfile = "users.json"
mailboxf = "/mail/lro"
today = datetime.date.today()
today_fmt = today.strftime("%Y")+"-"+today.strftime("%m")+"-"+today.strftime("%d")

def get_unread_emails(mailboxfile):
   unread = []
   if not os.path.isfile(mailboxfile):
       print("Mailboxfile doesn't exist: %s" % (mailboxfile))
       return unread

   mailboxfp = mailbox.mbox(mailboxfile)
   ind = 0
   for message in mailboxfp:
       flags = message.get_flags()
       if flags.find('R') == -1:
           unread.append(message)
           message.add_flag('R')
           mailboxfp[ind] = message
       ind = ind + 1

   mailboxfp.lock()
   mailboxfp.flush()
   mailboxfp.unlock()
   mailboxfp.close()
   return unread

def load_dictionary(dictfile):
   if not os.path.isfile(dictfile):
       return []

   usersfile = open(dictfile)
   userdictionary = json.load(usersfile)
   usersfile.close()
   return userdictionary

def get_from_lower(message):
   From = message.get_from()
   return From.split(" ")[0].lower()

def user_in_dict(email, dictionary):
   try:
       return dictionary[email]
   except KeyError:
       return False

def phlog_post_contents(email):
   return email.get_payload()

def write_phlog_post(filename, contents):
   ind = 0
   justfilenamenotpath = filename.split("/")[-1]
   while os.path.isfile(filename):
       if ind == 99:
           break
       filename = filename.split(".")[0].split("_")[0]+"_"+str(ind)+".txt"
       justfilenamenotpath = filename.split("/")[-1]

   with open(filename, "w") as phlogfile:
       phlogfile.write(contents)

   return justfilenamenotpath

def update_gophermap(gophermap, filename, description):
   entry = "0%s        %s" % (description, filename)

   with open(gophermap, "r") as gfp:
       buf = gfp.readlines()

   with open(gophermap, "w") as gfp:
       for line in buf:
           if "==================================================" in line:
               line = line+"\n"+entry+"\n"
           gfp.write(line)

def new_phlog_entry(message):
   email = get_from_lower(message)
   username = user_in_dict(email, userdictionary)
   if not username:
       print("User: %s not in user dictionary" % (email))
       return
   phlog_title = message['subject']
   phlog_filename = today_fmt + ".txt"
   phlog_contents = phlog_post_contents(message)
   phlog_dir = gopher_dir+"/"+username
   phlog_gophermap = phlog_dir+"/gophermap"
   phlog_filename = write_phlog_post(phlog_dir+"/"+phlog_filename, phlog_contents)
   update_gophermap(phlog_gophermap, phlog_filename, phlog_title+" <"+today_fmt+">")
   update_gophermap(gopher_dir+"/gophermap", username+"/"+phlog_filename, username+" - "+phlog_title+" <"+today_fmt+">")
   print("Added phlog post for %s" % (username))

userdictionary = load_dictionary(userdictionaryfile)

for message in get_unread_emails(mailboxf):
   new_phlog_entry(message)