# -*- coding: utf-8 -*-

#   This file is part of emesene.
#
#    Emesene is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    emesene is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with emesene; if not, write to the Free Software
#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

import Plugin, Theme

import gtk
import gobject
import pango

from time import *
from emesenelib.common import unescape


class MainClass( Plugin.Plugin ):
    description = _('Show a list with the history of online/offline events of every contact with a timestamp.')
    authors = { 'mr.archano' : 'archano@gmail.com', 'Jan de Mooij' : 'jandemooij@gmail.com' }
    website = ''
    displayName = _('StatusHistory')
    name = 'StatusHistory'

    def __init__( self, controller, msn ):
        Plugin.Plugin.__init__( self, controller, msn )
        self.description = _('Show a list with the history of online/offline events of every contact with a timestamp.')
        self.authors = { 'mr.archano' : 'archano@gmail.com',
            'Jan de Mooij' : 'jandemooij@gmail.com' }
        self.website = ''
        self.displayName = _('StatusHistory')
        self.name = 'StatusHistory'
        self.enabled = False
        self.controller = controller

        self.config = controller.config
        self.config.readPluginConfig(self.name)

        self.showStatusImage = ((self.config.getPluginValue(self.name,
            'showStatusImage', '1')) == '1')

    def start( self ):
        self.listStore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING,
            gobject.TYPE_STRING)
        self.box = gtk.VBox()
        self.addComboBox(self.box)

        self.addEntry('connected')

        self.box.show_all()
        self.controller.mainWindow.vbox.pack_start(self.box, False, False)
        self.onOnlineId = self.controller.msn.connect('user-online',
            self.on_online)
        self.onOfflineId = self.controller.msn.connect('user-offline',
            self.on_offline)
        self.enabled = True

    def stop( self ):
        self.controller.mainWindow.vbox.remove( self.box )
        self.disconnect( self.onOnlineId )
        self.disconnect( self.onOfflineId )
        self.enabled = False

    def check( self ):
        return ( True, 'Ok' )

    def configure( self ):
        l=[]
        l.append( Plugin.Option( 'showStatusImage', bool,
            _('Show status image:'), _('Show status image:'),
            self.showStatusImage))

        response = Plugin.ConfigWindow(
            _( 'StatusHistory plugin config' ), l ).run()
        if response != None:
            self.showStatusImage = response['showStatusImage'].value
            self.config.setPluginValue( self.name, 'showStatusImage',
                str(int(self.showStatusImage)) )

            if self.enabled:
                self.box.remove(self.comboBox)
                self.addComboBox(self.box)
        return True

    ####################

    def addComboBox(self, box):
        self.comboBox = gtk.ComboBox(self.listStore)

        self.timeTextCell = gtk.CellRendererText()
        self.nickTextCell = gtk.CellRendererText()
        self.nickTextCell.set_property('ellipsize', pango.ELLIPSIZE_END)

        if self.showStatusImage:
            self.statusCell = gtk.CellRendererPixbuf()
        else:
            self.statusCell = gtk.CellRendererText()

        self.comboBox.pack_start(self.timeTextCell, False)
        self.comboBox.pack_start(self.nickTextCell, True)
        self.comboBox.pack_start(self.statusCell, False)

        self.comboBox.add_attribute(self.timeTextCell, 'text', 0)
        self.comboBox.add_attribute(self.nickTextCell, 'text', 1)

        if self.showStatusImage:
            self.comboBox.set_cell_data_func(self.statusCell,
                self.cellLayoutFunc)
        else:
            self.comboBox.add_attribute(self.statusCell, 'text', 2)

        self.comboBox.set_active(0)
        self.comboBox.show()
        box.pack_start(self.comboBox, False, False)

    def cellLayoutFunc(self, layout, cell, model, iter):
        '''show pixbuf for status'''
        item = model[iter][2]
        if item == None:
            return
        if item == 'connected':
            item = 'online'
        pixbuf = self.controller.theme.statusToPixbuf(item)
        cell.set_property('pixbuf', Theme.resizePixbuf(pixbuf, 16, 16))

    def addEntry(self, status, email = None):
        '''add a new entry to the liststore'''
        if email != None:
            nick = unescape(self.controller.unifiedParser.getParser(
                        self.controller.msn.contactManager.\
                        getContactNick(email)).get())
        else:
            nick = self.controller.msn.user

        time = strftime('[%H:%M:%S]', localtime())
        self.listStore.prepend([time, nick, status])
        self.comboBox.set_active(0)

    def on_online( self, msnp, email, oldStatus ):
        if oldStatus == 'FLN':
            self.addEntry('online', email)

    def on_offline( self, msnp, email, oldStatus):
        self.addEntry('offline', email)
