""" A simple last bot wokkel example """
from twisted.internet import defer
import datetime
from twisted.words.protocols.jabber import jid
from wokkel import muc

class MUCLastBot(muc.MUCClient):
    
    def __init__(self, server, room, nick):
        muc.MUCClient.__init__(self)
        self.server   = server
        self.room     = room
        self.nick     = nick
        self.room_jid = jid.internJID(self.room+'@'+self.server+'/'+self.nick)
        self.last     = {}
        self.activity = None

    def _getLast(self, nick):
        return self.last.get(nick.lower())
    
    def _setLast(self, user):
        user.last = datetime.datetime.now()
        self.last[user.nick.lower()] = user
        self.activity = user

    def initialized(self):
        """The bot has connected to the xmpp server, now try to join the room.
        """
        self.join(self.server, self.room, self.nick).addCallback(self.initRoom)
        
    @defer.inlineCallbacks
    def initRoom(self, room):
        """Configure the room if we just created it.
        """

        if int(room.status) == muc.STATUS_CODE_CREATED:
            config_form = yield self.getConfigureForm(self.room_jid.userhost())
            
            # set config default
            config_result = yield self.configure(self.room_jid.userhost())
            
            

    def userJoinedRoom(self, room, user):
        """If a user joined a room, make sure they are in the last dict
        """
        self._setLast(user)

    def userLeftRoom(self, room, user):
        """
        """
        self._setLast(user)

    def receivedGroupChat(self, room, user, body):
        # check if this message addresses the bot
        cmd       = None
        user_nick = None
        try:
            cmd, user_nick = body.split(" ")
        except ValueError:
            # value error means it was a one word body
            cmd = body
        cmd = cmd.replace("!", "")
        method = getattr(self, 'cmd_'+cmd, None)
        if method:
            method(room, user_nick)
        
        # log last message
        user.last_message = body
        self._setLast(user)

    def cmd_last(self, room, user_nick):
        """
        """
        if user_nick is None:
            # show last person to do something
            self._sendLast(room, self.activity)
        else:
            u = self._getLast(user_nick)
            if u:
                self._sendLast(room, u)
            else:
                self.groupChat(self.room_jid, 'Sorry %s, That person is unknown to me.' % (user.nick,))

    def _sendLast(self, room, user):
        """ Grab last information from user and room and send it to the room.
        """
        last_message   = getattr(user,'last_message', '')
        last_stamp     = getattr(user,'last', '')
        
        if room.inRoster(user):
            message = """%s is in this room and said '%s' at %s.""" % (user.nick, last_message, last_stamp)
        else:
            message = """%s left this room at %s and last said '%s'.""" % (user.nick, last_stamp, last_message)

        self.groupChat(self.room_jid, message)
