#!/usr/local/bin/python

import common
import imp
import pickle
import random
import sys
import os

DRINKSFILE = '%s/drinksfile.pck' % os.getcwd()
module_triggers = ['drinkslist', 'adddrink', 'deldrink', 'popdrink', 'drink']

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 == 'drinkslist':
    result = GetDrinks()
  elif keyword == 'adddrink':
    result = AddDrink(msg, irc)
  elif keyword == 'deldrink':
    result = DelDrink(msg, irc)
  elif keyword == 'popdrink':
    result = PopDrink(msg)
  elif keyword == 'drink':
    result = ServeDrink(msg)
  common.DeliverMessage(result, irc, channel)

def GetDrinks():
  """List drinks in the database
  
  Args:
    None
    
  Returns:
    drinkslist: ('drink', 'drink', ...)
  """

  try:
    drinkspickle = open(DRINKSFILE, 'r')
  except IOError:
    print 'Drinks file %s does not exist' % DRINKSFILE
    drinkslist = ['natural spring water']
    SaveDrinks(drinkslist)
    drinkspickle = open(DRINKSFILE, 'r')

  try:
    drinkslist = pickle.load(drinkspickle)
  except EOFError:
    print 'Drinks file %s is empty' % DRINKSFILE
    drinkslist = ['natural spring water']
    SaveDrinks(drinkslist)
  return drinkslist


def SaveDrinks(drinkslist):
  """Saves the drinks to the drinks file.

  Args:
    drinkslist: ['drink', 'drink'...]

  Returns:
    str: Success or failure message
  """

  drinkspickle = open(DRINKSFILE, 'w')
  pickle.dump(drinkslist,drinkspickle)
  drinkspickle.close()
  return 'Drinks list updated!'


def AddDrink(drink):
  """Add drinks to the database
  
  Args:
    msg: string

  Returns:
    str: Success or failure message
  """
  if len(drink) > 64:
    result = 'Hmmm that drink name is rather long, isn\'t it?'
    return result
  drinkslist = GetDrinks()
  drinkslist.append(drink)
  SaveDrinks(drinkslist)
  result = 'Added %s to the database' % drink
  return result


def PopDrink():
  """Pop the database, to remove the latest entry
  
  Args:
    None
    
  Returns:
    str: Success or failure message"""

  drinkslist = GetDrinks()
  try:
    drinkslist.pop()
    SaveDrinks(drinkslist)
    result = 'Popped the database'
  except IndexError:
    result = 'Unable to pop empty database'
  return result


def DelDrink(drink):
  """Remove drinks from the database

  Args:
    channel: string
    msg: string

  Returns:
    str: Success or failure message
  """

  drinkslist = GetDrinks()
  try:
    drinkslist.remove(drink)
    msg = 'Removed %s from the database' % drink
  except ValueError:
    msg = '%s is not in the database' % drink
  SaveDrinks(drinkslist)
  return drinkslist


def ServeDrink(nick):
  """Serve the drinks!

  Args:
    msg: string

  Returns:
    str: Message serving drink
  """

  drinkslist = GetDrinks()
  drink = random.choice(drinkslist)

  if not nick:
    nick = 'you'
  result = 'pours %s one %s' % (nick, drink)
  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:
    Gather(keyword, argument)

if __name__ == '__main__':
  main()

