#!/usr/bin/env python

#
# Implementation for user info controller.
#

import datetime
import cherrypy
from dm.common.constants import dmRole
from dm.common.objects.authorizationPrincipal import AuthorizationPrincipal 
from dm.common.objects.dmObjectManager import DmObjectManager
from dm.common.objects.dmSession import DmSession
from dm.common.db.api.userDbApi import UserDbApi
from dm.common.exceptions.objectNotFound import ObjectNotFound

class AuthSessionControllerImpl(DmObjectManager):
    """ User info controller implementation class. """

    def __init__(self):
        DmObjectManager.__init__(self)
        self.userDbApi = UserDbApi()

    def getAuthorizationPrincipal(self, username):
        principal = None
        try:
            user = self.userDbApi.getUserWithPasswordByUsername(username)
            principal = AuthorizationPrincipal(name=username, token=user.get('password'))
            principal.setUserSystemRoleDict(user.get('userSystemRoleDict', {}))
            principal.setUserExperimentRoleDict(user.get('userExperimentRoleDict', {}))
            principal.setSessionRole(dmRole.DM_USER_SESSION_ROLE)
            for userSystemRoleId in principal.get('userSystemRoleDict', {}).keys():
                if userSystemRoleId == dmRole.DM_ADMIN_SYSTEM_ROLE_ID:
                    principal.setSessionRole(dmRole.DM_ADMIN_SESSION_ROLE)
                    break
        except Exception, ex:
            self.logger.debug(ex)
        return principal

    def addSession(self, sessionId, sessionInfo):
        sessionCache = cherrypy.session.cache
        self.logger.debug('Session cache length: %s' % (len(sessionCache)))
        sessionCache[sessionId] = (sessionInfo, datetime.datetime.now())
        self.logger.debug('Session cache: %s' % (sessionCache))
        return DmSession(sessionInfo)

    def checkSession(self, sessionId):
        sessionCache = cherrypy.session.cache
        sessionTuple = sessionCache.get(sessionId)
        if not sessionTuple:
            raise ObjectNotFound('Session %s not found in cache.' % sessionId)
        sessionInfo = sessionTuple[0]
        oldTimestamp = sessionTuple[1]
        newTimestamp = datetime.datetime.now()
        self.logger.debug('Updated timestamp from %s to %s for session id %s' % (oldTimestamp, newTimestamp, sessionId))
        sessionCache[sessionId] = (sessionInfo, newTimestamp)
        return DmSession(sessionInfo)