# Embedded file name: /Users/pierredavidbelanger/Dev/chatter-bot-api/python/chatterbotapi.py
import md5
import urllib
import urllib2
import uuid
import xml.dom.minidom

class ChatterBotType:
    CLEVERBOT = 1
    JABBERWACKY = 2
    PANDORABOTS = 3


class ChatterBotFactory:

    def create(self, type, arg = None):
        if type == ChatterBotType.CLEVERBOT:
            return _Cleverbot('http://www.cleverbot.com/webservicemin', 35)
        elif type == ChatterBotType.JABBERWACKY:
            return _Cleverbot('http://jabberwacky.com/webservicemin', 29)
        elif type == ChatterBotType.PANDORABOTS:
            if arg == None:
                raise Exception('PANDORABOTS needs a botid arg')
            return _Pandorabots(arg)
        else:
            return


class ChatterBot:

    def create_session(self):
        return None


class ChatterBotSession:

    def think_thought(self, thought):
        return thought

    def think(self, text):
        thought = ChatterBotThought()
        thought.text = text
        return self.think_thought(thought).text


class ChatterBotThought:
    pass


class _Cleverbot(ChatterBot):

    def __init__(self, url, endIndex):
        self.url = url
        self.endIndex = endIndex

    def create_session(self):
        return _CleverbotSession(self)


class _CleverbotSession(ChatterBotSession):

    def __init__(self, bot):
        self.bot = bot
        self.vars = {}
        self.vars['start'] = 'y'
        self.vars['icognoid'] = 'wsf'
        self.vars['fno'] = '0'
        self.vars['sub'] = 'Say'
        self.vars['islearning'] = '1'
        self.vars['cleanslate'] = 'false'

    def think_thought(self, thought):
        self.vars['stimulus'] = thought.text
        data = urllib.urlencode(self.vars)
        data_to_digest = data[9:self.bot.endIndex]
        data_digest = md5.new(data_to_digest).hexdigest()
        data = data + '&icognocheck=' + data_digest
        url_response = urllib2.urlopen(self.bot.url, data)
        response = url_response.read()
        response_values = response.split('\r')
        self.vars['sessionid'] = _utils_string_at_index(response_values, 1)
        self.vars['logurl'] = _utils_string_at_index(response_values, 2)
        self.vars['vText8'] = _utils_string_at_index(response_values, 3)
        self.vars['vText7'] = _utils_string_at_index(response_values, 4)
        self.vars['vText6'] = _utils_string_at_index(response_values, 5)
        self.vars['vText5'] = _utils_string_at_index(response_values, 6)
        self.vars['vText4'] = _utils_string_at_index(response_values, 7)
        self.vars['vText3'] = _utils_string_at_index(response_values, 8)
        self.vars['vText2'] = _utils_string_at_index(response_values, 9)
        self.vars['prevref'] = _utils_string_at_index(response_values, 10)
        self.vars['emotionalhistory'] = _utils_string_at_index(response_values, 12)
        self.vars['ttsLocMP3'] = _utils_string_at_index(response_values, 13)
        self.vars['ttsLocTXT'] = _utils_string_at_index(response_values, 14)
        self.vars['ttsLocTXT3'] = _utils_string_at_index(response_values, 15)
        self.vars['ttsText'] = _utils_string_at_index(response_values, 16)
        self.vars['lineRef'] = _utils_string_at_index(response_values, 17)
        self.vars['lineURL'] = _utils_string_at_index(response_values, 18)
        self.vars['linePOST'] = _utils_string_at_index(response_values, 19)
        self.vars['lineChoices'] = _utils_string_at_index(response_values, 20)
        self.vars['lineChoicesAbbrev'] = _utils_string_at_index(response_values, 21)
        self.vars['typingData'] = _utils_string_at_index(response_values, 22)
        self.vars['divert'] = _utils_string_at_index(response_values, 23)
        response_thought = ChatterBotThought()
        response_thought.text = _utils_string_at_index(response_values, 16)
        return response_thought


class _Pandorabots(ChatterBot):

    def __init__(self, botid):
        self.botid = botid

    def create_session(self):
        return _PandorabotsSession(self)


class _PandorabotsSession(ChatterBotSession):

    def __init__(self, bot):
        self.vars = {}
        self.vars['botid'] = bot.botid
        self.vars['custid'] = uuid.uuid1()

    def think_thought(self, thought):
        self.vars['input'] = thought.text
        data = urllib.urlencode(self.vars)
        url_response = urllib2.urlopen('http://www.pandorabots.com/pandora/talk-xml', data)
        response = url_response.read()
        response_dom = xml.dom.minidom.parseString(response)
        response_thought = ChatterBotThought()
        response_thought.text = response_dom.getElementsByTagName('that')[0].childNodes[0].data.strip()
        return response_thought


def _utils_string_at_index(strings, index):
    if len(strings) > index:
        return strings[index]
    else:
        return ''
