#!/usr/bin/env python

import optparse
import simplejson

class DumpData(object):

    def __init__(self, domainRegistry):
        self.assertIsDomainRegistry(domainRegistry)
        self.domainRegistry = domainRegistry
        self.jsonDataDump = ''
        self.dataDump = None

    def assertIsDomainRegistry(self, domainRegistry):
        if not hasattr(domainRegistry, 'getDomainClassRegister'):
            msg = "Domain registry has no 'getDomainClassRegister()' method."
            raise Exception(msg)

    def dumpData(self):
        self.dataDump = {}
        domainClassRegister = application.registry.getDomainClassRegister()
        for className in domainClassRegister.keys():
            classData = {}
            domainClass = application.registry.getDomainClass(className)
            # Dumping class meta data
            metaClassData = {}
            for attr in domainClass.meta.attributes:
                metaClassData[attr.name] = attr.typeName
            classData['metaData'] = metaClassData
            # Dumping class register objects
            domainRegister = domainClass.createRegister()
            for domainObject in domainRegister:
                domainObjectData = domainObject.asDictValues()
                # Dumping object data
                classData[domainObject.id] = domainObjectData
            self.dataDump[className] = classData
        
    def dumpJsonData(self):
        self.dumpData()
        self.jsonDataDump = simplejson.dumps(self.dataDump)

    def printData(self):
        self.dumpJsonData()
        print self.jsonDataDump

class SystemNameError(Exception): pass

if __name__ == '__main__':
    optionParser = optparse.OptionParser()
    optionParser.add_option(
            '-s', '--system',
            dest='system',
            default='',
            help='A name of a system'
    )
    (options, args) = optionParser.parse_args()
    systemName = options.system
    if not systemName:
        raise SystemNameError(systemName)
    else:
        print "Importing %s.soleInstance" % systemName
    soleInstance = __import__(systemName+'.soleInstance','','','*')
    from soleInstance import application
    dataDumper = DumpData(application.registry)
    dataDumper.printData()

