import sys
from gi.repository import EDataServer
from gi.repository import EBookContacts
from gi.repository import EBook
from gi.repository import GObject


def _listSources():
    registry  = EDataServer.SourceRegistry.new_sync()
    sources = registry.list_sources("Address Book")
    for source in sources:
        print("%s - %s / %s [%s]" % (source.get_uid(), source.get_display_name(), source.get_parent(), str(source.get_enabled())))

def _createAggregatorSource():
    source = EDataServer.Source.new()
    source.set_display_name("AggregatorDisplayName")
    source.set_parent("contacts-stub")
   
    ext = source.get_extension("Address Book")
    ext.set_backend_name("aggregator")

    registry  = EDataServer.SourceRegistry.new_sync()
    registry.commit_source_sync(source, None)

def _createSource(sourceName):
    source = EDataServer.Source.new()
    source.set_display_name(sourceName)
    source.set_parent("contacts-stub")
    source.set_enabled(False)
   
    ext = source.get_extension("Address Book")
    ext.set_backend_name("local")

    registry = EDataServer.SourceRegistry.new_sync()
    registry.commit_source_sync(source, None)

def _removeSource(sourceUid):
    registry  = EDataServer.SourceRegistry.new_sync()
    sources = registry.list_sources()
    for source in sources:
        if source.get_uid() == sourceUid:
            source.remove_sync(None)
            print("Source removed: %s" % (source.get_display_name()))

def _enableSource(sourceUid, sourceEnabled):
    registry  = EDataServer.SourceRegistry.new_sync()
    sources = registry.list_sources()
    for source in sources:
        if source.get_uid() == sourceUid:
            source.set_enabled(sourceEnabled == 'True')
            registry = EDataServer.SourceRegistry.new_sync()
            registry.commit_source_sync(source, None)
            return

def _startViewOnObjectsAdded(view, objects):
    print("Contact added:", objects)

def _startViewOnProgress(view, percent, message):
    print("View progress: %d - %s" % (percent, message))

def _startViewOnComplete(view, error, mainloop):
    print("View complete")
    mainloop.quit()

def _startView(sourceUid):
    registry = EDataServer.SourceRegistry.new_sync()
    sources = registry.list_sources()
    for source in sources:
        if source.get_uid() == sourceUid:
            mainloop = GObject.MainLoop()

            print("Start view: %s" % source.get_display_name())
            client = EBook.BookClient.connect_sync (source, None)
            (error, view) = client.get_view_sync ('', None)
            view.connect("objects_added", _startViewOnObjectsAdded)
            view.connect("progress", _startViewOnProgress)
            view.connect("complete", _startViewOnComplete, mainloop)
            view.start()

            mainloop.run()
            view.stop()
            view = None
            client = None
            return

    
        
if __name__ == "__main__":    
    print(str(sys.argv))
    if '--create-aggregator' in sys.argv:
	    _createAggregatorSource()
    if '--list' in sys.argv:
        _listSources()
    if '--create' in sys.argv:
        _createSource(sys.argv[2])
    if '--remove' in sys.argv:
        _removeSource(sys.argv[2])
    if '--enable' in sys.argv:
        _enableSource(sys.argv[2], sys.argv[3])       
    if '--start-view' in sys.argv:
        _startView(sys.argv[2])

