#!/usr/bin/env python

import threading
import os.path
import sqlalchemy 
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import mapper
from sqlalchemy.orm import relationship

from dm.common.exceptions.commandFailed import CommandFailed
from dm.common.exceptions.configurationError import ConfigurationError
from dm.common.utility.loggingManager import LoggingManager
from dm.common.utility.configurationManager import ConfigurationManager
from dmMongoClient import DmMongoClient

class MongoDbManager:
    """ Singleton class for mongo db management. """

    CONFIG_SECTION_NAME = 'MongoDbManager'
    MONGO_DB_NAME_KEY = 'mongoDbName'
    MONGO_DB_USER_KEY = 'mongoDbUser'
    MONGO_DB_URI_KEY = 'mongoDbUri' 
    MONGO_DB_PASSWORD_FILE_KEY = 'mongoDbPasswordFile' 
    CONFIG_OPTION_NAME_LIST = [ 'dbName', 'dbUser', 'dbPasswordFile' ]

    # Singleton.
    __lock = threading.RLock()
    __instance = None

    @classmethod
    def getInstance(cls):
        from dm.common.mongodb.impl.mongoDbManager import MongoDbManager
        try:
            mgr = MongoDbManager()
        except MongoDbManager, ex:
            mgr = ex
        return mgr 

    def __init__(self):
        MongoDbManager.__lock.acquire()
        try:
            if MongoDbManager.__instance is not None:
                raise MongoDbManager.__instance
            MongoDbManager.__instance = self
            self.lock = threading.RLock()
            self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__)
            cm = ConfigurationManager.getInstance()
            self.dbName = cm.getConfigOption(MongoDbManager.CONFIG_SECTION_NAME, MongoDbManager.MONGO_DB_NAME_KEY)
            self.logger.debug('Mongo DB name: %s' % self.dbName)
            self.dbUri = cm.getConfigOption(MongoDbManager.CONFIG_SECTION_NAME, MongoDbManager.MONGO_DB_URI_KEY)
            self.logger.debug('Mongo DB URI: %s' % self.dbUri)
            self.dbUser = cm.getConfigOption(MongoDbManager.CONFIG_SECTION_NAME, MongoDbManager.MONGO_DB_USER_KEY)
            self.logger.debug('Mongo DB user: %s' % self.dbUser)
            self.dbPasswordFile = cm.getConfigOption(MongoDbManager.CONFIG_SECTION_NAME, MongoDbManager.MONGO_DB_PASSWORD_FILE_KEY)
            self.logger.debug('Mongo DB password file: %s' % self.dbPasswordFile)
            #dbPassword = open(dbPasswordFile, 'r').readline().strip()

        finally:
            MongoDbManager.__lock.release()

    def getLogger(self):
        return self.logger

    def getDbClient(self):
        return DmMongoClient(self.dbName, self.dbUri)


#######################################################################
# Testing.
if __name__ == '__main__':
    ConfigurationManager.getInstance().setConsoleLogLevel('debug')
    mgr = MongoDbManager.getInstance()