#!/usr/local/bin/python

import common
import imp
import pickle
import os
import sys

module_triggers = ['help', 'addhelp', 'delhelp', 'pophelp', 'listhelp']
HELPFILE = '%s/helpfile.pck' % os.getcwd()

def Gather(keyword, msg = None, irc = None, channel = None):
  module_location = imp.find_module('common')
  module = imp.load_module('common', *module_location)
  msg = common.NormalizeMessage(msg, irc, keyword)
  if keyword == 'listhelp':
    result = ListHelp()
  elif keyword == 'addhelp':
    result = AddHelp(msg, irc)
  elif keyword == 'delhelp':
    result = DelHelp(msg, irc)
  elif keyword == 'pophelp':
    result = PopHelp(msg)
  elif keyword == 'help':
    result = ServeHelp(msg)
  common.DeliverMessage(result, irc, channel)

def ListHelp():
  """List help in the database
  
  Args:
    None
    
  Returns:
    helplist: ('help', 'help', ...)
  """
  try:
    helppickle = open(HELPFILE, 'r')
  except IOError:
    helplist = ['No help for you!']
    helppickle = open(HELPFILE, 'w')
    pickle.dump(helplist,helppickle)
    helppickle.close()
    helppickle = open(HELPFILE, 'r')
  try:
    helplist = pickle.load(helppickle)
    helppickle.close()
  except EOFError:
    helplist = ['No help for you!']
  helpcountmsg = '%s help in the database:' % len(helplist)
  result = [helpcountmsg]
  for help in helplist:
    result.append(help)
  return result


def AddHelp(newhelp):
  """Add help to the database
  
  Args:
    irc: IRCClient object
    msg: string

  Returns:
    str: Success or failure message
  """
  if len(newhelp) > 256:
    result = 'Hmmm that help name is rather long, isn\'t it?'
    return result
  try:
    helppickle = open(HELPFILE, 'r')
  except IOError:
    helplist = ['No help for you!']
    helppickle = open(HELPFILE, 'w')
    pickle.dump(helplist,helppickle)
    helppickle.close()
    helppickle = open(HELPFILE, 'r')
  try:
    helplist = pickle.load(helppickle)
    helppickle.close()
  except EOFError:
    helplist = ['No help for you!']
  helplist.append(newhelp)
  helppickle = open(HELPFILE, 'w')
  pickle.dump(helplist,helppickle)
  helppickle.close()
  result = 'Added "%s" to the database' % newhelp
  return result


def PopHelp():
  """Pop the database, to remove the latest entry
  
  Args:
    irc: IRCClient object
    channel: string
    
  Returns:
    str: Success or failure message
  """

  try:
    helppickle = open(HELPFILE, 'r')
  except IOError:
    msg = 'Help file %s does not exist in this reality' % HELPFILE
    common.DeliverMessage(msg, irc, channel)
  try:
    helplist = pickle.load(helppickle)
    helppickle.close()
  except EOFError:
    result = 'Help file %s is empty' % HELPFILE
    return result
  try:
    helplist.pop()
    helppickle = open(HELPFILE, 'w')
    pickle.dump(helplist,helppickle)
    helppickle.close()
    result = 'Popped the database'
  except IndexError:
    result = 'Unable to pop empty database'
  return result

def DelHelp(msg):
  """Remove help from the database

  Args:
    irc: IRCClient object
    channel: string
    msg: string

  Returns:
    str: Success or failure message
  """
  try:
    helppickle = open(HELPFILE, 'r')
  except IOError:
    result = 'Help file %s does not exist in this reality' % HELPFILE
    return result
  try:
    helplist = pickle.load(helppickle)
    helppickle.close()
  except EOFError:
    result = 'Help file %s is empty' % HELPFILE
    return result
  try:
    helplist.remove(oldhelp)
    result = 'Removed %s from the database' % help
  except ValueError:
    result = '%s is not in the database' % help
  helppickle = open(HELPFILE, 'w')
  pickle.dump(helplist,helppickle)
  helppickle.close()
  return result


def ServeHelp(msg = None):
  """Serve the help!

  Args:
    irc: IRCClient object
    channel: string
    msg: string

  Returns:
    None
  """
  if not msg:
    msg = ''
  else:
    msg = '%s: ' % msg
  try:
    helppickle = open(HELPFILE, 'r')
    helplist = pickle.load(helppickle)
    helppickle.close()
    import random
    helpful = random.choice(helplist)
  except IOError:
    helpful = 'I\'m not very helpful :( Show me how to help you: "addhelp <help>"'
  result = '%s%s' % (msg, helpful)
  return result


def main():
  try:
    keyword = sys.argv[1]
  except IndexError:
    sys.exit(1)
  try:
    argument = sys.argv[2]
  except IndexError:
    argument = None

  if keyword in module_triggers:
    result = Gather(keyword, argument)

if __name__ == '__main__':
  main()

