import os
import mh_python as hal
from oyoyo.client import IRCClient
from oyoyo.cmdhandler import DefaultCommandHandler
from oyoyo import helpers
import re
import atexit
import logging 
from optparse import OptionParser

parser = OptionParser()
parser.add_option("-s", "--server", dest="server", help="IRC Server", metavar="HOST")
parser.add_option("-p", "--port", dest="port", help="Port", metavar="PORT", type="int", default=6667)
parser.add_option("-c", "--chan", dest="chan", help="Channel", metavar="CHAN")
parser.add_option("-b", "--brain", dest="brain", help="MegaHAL files directory", metavar="DIR")
parser.add_option("-n", "--nosey", dest="nosey", action="store_true", help="Listen to everything said in the channel")

(options, args) = parser.parse_args()

if options.brain:
    os.chdir(options.brain)

hal.initbrain()

HOST = options.server or "localhost"
PORT = options.port
NICK = "HALBot"
CHAN = options.chan or "#halchat"

isToMeExpr = re.compile("^hal(bot)?:\s(.*)", re.IGNORECASE)
listenToExpr = re.compile("^(\w+[:>]\s)?(.*)")

ircConnection = None

def connectCallback(connection):
    helpers.join(connection, CHAN)

class HalHandler(DefaultCommandHandler):
    def privmsg(self, nick, chan, msg):
        (name, addr) = nick.split("!")
        if name == "parm" and chan.lower() == NICK.lower():
            self.doCmd(msg)

        parsedMsg = self.isToMe(msg)
        if parsedMsg != None:
            self.doReply(nick, chan, parsedMsg)
        elif options.nosey:
            self.listenTo(nick, chan, msg)

    def doCmd(self, msg):
        if msg == "connect":
            print "Connecting to %s" % (CHAN)
            helpers.join(self.client, CHAN)
        elif msg == "flush":
            print "Cleaning up"
            hal.cleanup()

    def isToMe(self, msg):
        match = isToMeExpr.match(msg)
        if match != None:
            return match.group(2)
        return None

    def doReply(self, nick, chan, msg):
        (name, loc) = nick.split("!")
        reply = hal.doreply(msg)
        helpers.msg(self.client, chan, "%s: %s" % (name, reply))
        print "%s > %s" % (name, msg)
        print "%s < %s" % (name, reply)

    def listenTo(self, nick, chan, msg):
        (name, loc) = nick.split("!")
        msgs = listenToExpr.match(msg)
        to = msgs.group(1) or ""
        text = msgs.group(2) or ""
        print "%s > %s%s" % (name, to, text)
        hal.learn(text)

ircClient = IRCClient(HalHandler, host = HOST, port = PORT, nick = NICK,
                      connect_cb = connectCallback)

ircConnection = ircClient.connect()

@atexit.register
def cleanup():
    hal.cleanup()
    print "bai bai"

while True:
    ircConnection.next()

