#!/usr/bin/env python

from dm.common.exceptions.dmException import DmException
from dm.common.utility.loggingManager import LoggingManager
from dm.common.mongodb.impl.mongoDbManager import MongoDbManager

class DmMongoDbApi:
    """ Base Mongo DB API class. """
    def __init__(self):
        self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__)
        self.dbClient = MongoDbManager.getInstance().getDbClient()

    # Decorator for all DB methods
    @classmethod
    def executeDbCall(cls, func):
        def dbCall(*args, **kwargs):
            try:
                try:
                    return func(*args, **kwargs)
                except DmException, ex:
                    raise
                except Exception, ex:
                    cls.getLogger().exception('%s' % ex)
                    raise DmException(exception=ex)
            finally:
                # For now, do nothing
                pass
        return dbCall

    @classmethod
    def getLogger(cls):
        logger = LoggingManager.getInstance().getLogger(cls.__name__)
        return logger

    @classmethod
    def listToDmObjects(cls, mongoDbObjectList, dmObjectClass):
        dmObjectList = []
        for o in mongoDbObjectList:
            dmObjectList.append(cls.toDmObject(o, dmObjectClass))
        return dmObjectList

    @classmethod
    def toDmObject(cls, mongoDbObject, dmObjectClass):
        cls.scrubMongoDbObject(mongoDbObject)
        return dmObjectClass(mongoDbObject)

    @classmethod
    def scrubMongoDbObject(cls, mongoDbObject):
        for key in ['_id']:
            if mongoDbObject.has_key(key):
                # Remove leading underscore
                newKey = key[1:]
                mongoDbObject[newKey] = str(mongoDbObject[key])
                del mongoDbObject[key]

#######################################################################
# Testing.
if __name__ == '__main__':
    api = DmMongoDbApi()