#!/usr/bin/env python

import os

from dm.common.utility.configurationManager import ConfigurationManager
from dm.common.objects.dmObjectManager import DmObjectManager
from dm.common.utility.objectUtility import ObjectUtility
from dm.common.utility.singleton import Singleton
from dm.common.exceptions.objectNotFound import ObjectNotFound

class SingleSignOnManager(DmObjectManager, Singleton):

    DEFAULT_SESSION_TIMEOUT_IN_SECONDS = 3600 # seconds

    CONFIG_SECTION_NAME = 'SingleSignOnManager'
    SESSION_MANAGER_KEY = 'sessionManager'
    SESSION_TIMEOUT_IN_SECONDS_KEY = 'sessionTimeoutInSeconds'

    # Singleton instance.
    __instance = None

    def __init__(self):
        if SingleSignOnManager.__instance:
            return
        SingleSignOnManager.__instance = self
        DmObjectManager.__init__(self)
        self.configurationManager = ConfigurationManager.getInstance()
        self.sessionManager = None
        self.configure()

    def configure(self):
        configItems = self.configurationManager.getConfigItems(SingleSignOnManager.CONFIG_SECTION_NAME)
        self.logger.debug('Got config items: %s' % configItems)
        if not configItems:
            return
        sessionTimeout = self.configurationManager.getConfigOption(SingleSignOnManager.CONFIG_SECTION_NAME, SingleSignOnManager.SESSION_TIMEOUT_IN_SECONDS_KEY, SingleSignOnManager.DEFAULT_SESSION_TIMEOUT_IN_SECONDS)
        self.logger.debug('Session timeout: %s' % sessionTimeout)

        # Create session manager
        sessionManager = self.configurationManager.getConfigOption(SingleSignOnManager.CONFIG_SECTION_NAME, SingleSignOnManager.SESSION_MANAGER_KEY)
        (moduleName,className,constructor) = self.configurationManager.getModuleClassConstructorTuple(sessionManager, SingleSignOnManager)    
        self.logger.debug('Creating session manager class: %s' % className)
        self.sessionManager = ObjectUtility.createObjectInstance(moduleName, className, constructor)

    def addSession(self, sessionId, sessionInfo):
        if self.sessionManager:
            self.logger.debug('Adding session id %s: %s' % (sessionId,sessionInfo))
            try:
                return self.sessionManager.addSession(sessionId, sessionInfo)
            except Exception, ex:
                self.logger.error(ex)
        return None

    def checkSession(self, sessionId):
        if self.sessionManager:
            self.logger.debug('Checking session id: %s' % sessionId)
            try:
                return self.sessionManager.checkSession(sessionId)
            except ObjectNotFound, ex:
                self.logger.debug(ex)
            except Exception, ex:
                self.logger.error(ex)
        return None

#######################################################################
# Testing.
if __name__ == '__main__':
    am = AuthorizationPrincipalManager.getInstance()
    authPrincipal = am.getAuthorizationPrincipal('sveseli', 'sv')
    print 'Auth principal: ', authPrincipal