#!/usr/bin/env python
# vim: set sw=4 ts=4 si et: 

import sys
import os
import string
#from qt import *
from jabber import *
import StringIO
#import time
from account import Account
from config import Config
#from re import *
from optparse import OptionParser

#from threading import *
from xml.sax import saxutils
from xml.sax import make_parser
# for prettyprint
from xml.dom.ext import *
from xml.dom.ext.reader.Sax import *

class Answer:
    def __init__(self, question, answerlist):
        self._answer = None
        while not self._answer:
            sys.stderr.write(question)
            tmp_ans = raw_input()
            if tmp_ans in (answerlist): 
                self._answer = tmp_ans
      
    def get(self):
        return self._answer;
    
    
class JabSync:
    def __init__(self):
        # init des var
        self._commonJIDs = {}
        self._commonTransports = {}
        self._configFile = None
        self._config = None
        self._accountList = None
        self._jabservers = {}

    def parseCmdLine(self):
        parser = OptionParser()
        parser.add_option(\
            "-c","--config",\
            action="store", \
            type="string", \
            dest="filename",\
            help="Use file a configuration file",\
            metavar="config")
        (options,args)=parser.parse_args()
        if options.filename:
            self._configFile=options.filename
        else:
            self._configFile=os.path.join(os.path.expanduser("~"),".jabsync")
        print "Configuration file: " + self._configFile 

    def init(self):
        self._config = Config()
        self._config.loadFromFile(self._configFile)
        self._accountList = self._config.getAccounts()
        for account in self._accountList:
            account.connect()
            agents = account.getAgents()
            self._commonTransports.update(agents)
        for transport in self._commonTransports.keys():
            print "Transport: "+transport
 
    def giveTransport(self, hostName):
        if self._jabservers.has_key(hostName):
            trans_proto = hostName
            return trans_proto
        else:
            if self._commonTransports.has_key(hostName):
                trans_proto = self._commonTransports[hostName]
                return trans_proto
            else:
                # TODO: ask user input
                is_jabber = Answer(\
                    "# ERR : is "+hostName+" a jabber server ? [y/n]\n",\
                    ["y","n"]).get()
                if is_jabber == "y": 
                    self._jabservers[hostName] = 1
                else:
                    what_tp_ans = {\
                        "a" : "aim",\
                        "i" : "icq",\
                        "r" : "irc",\
                        "g" : "gadu",\
                        "m" : "msn",\
                        "p" : "public",\
                        "v" : "private",\
                        "y" : "yahoo",\
                        "-" : "forget"}
                    what_transport = Answer(\
                        "  Select transport type :\n"+\
                        "   [a]im"+\
                        "   [i]cq"+\
                        "   i[r]c):"+\
                        "   [g]adu"+\
                        "   [m]sn"+\
                        "   [p]ublic:"+\
                        "   pri[v]ate:"+\
                        "   [y]ahoo"+\
                        "   [-] Forget JIDs using this host",\
                        what_tp_ans.keys())
                    trans_proto = what_tp_ans[what_transport.get()]
                    print "Selected : " + trans_proto
                    if trans_proto == "forget": 
                        # TODO: ajouter regles d'exclusion
                        zero = 0
                    else:
                        # TODO: ajouter transport a la config XML
                        self._commonTransports[hostName] = trans_proto
                        zero = 0 
                return self.giveTransport(hostName)

      
    def get(self):
        print "jabsync::get\n"
        #get Roster
        for account in self._accountList:
            roster = account.getRoster()
            # fusionner les roster
            jid_list = roster.getJIDs()
            for jid in jid_list:
                print "Getting... " 
                print jid
                transport = jid.getDomain()
                trans_proto = self.giveTransport(transport)
                if not self._commonJIDs.has_key(trans_proto):
                    self._commonJIDs[trans_proto]={}
                jid_name = roster.getName(jid)
                jid_groups = roster.getGroups(jid)
                if not jid_name: jid_name = jid.getNode()	
                if not self._commonJIDs[trans_proto].has_key(jid.getNode()):
                    self._commonJIDs[trans_proto][jid.getNode()] = \
                        (jid_name,jid_groups)
                print "\x1B[G <- "+jid.getNode()+" @ "+trans_proto+" = "+jid_name

  #upload rosters
    def set(self):
        for account in self._accountList:
            account.setRoster(self._commonJIDs)
  
    def stop(self):
        for account in self._accountList:
            account.disconnect()
      
if __name__ == "__main__":
    jabsync=JabSync()
    jabsync.parseCmdLine()
    jabsync.init()
    jabsync.get()
    jabsync.set()
    jabsync.stop()