#!/usr/bin/env python

import os
import json
import urllib

from dm.common.utility.encoder import Encoder
from dm.common.exceptions.dmException import DmException
from dm.common.exceptions.invalidRequest import InvalidRequest
from dm.common.objects.authorizationPrincipal import AuthorizationPrincipal
from dm.common.objects.dmSession import DmSession
from dsRestApi import DsRestApi

class AuthRestApi(DsRestApi):
   
    def __init__(self, username=None, password=None, host=None, port=None, protocol=None):
        DsRestApi.__init__(self, username, password, host, port, protocol)

    @DsRestApi.execute
    def getAuthorizationPrincipal(self, username):
        if username is None:
            raise InvalidRequest('Username must be provided.')
        url = '%s/authorizationPrincipals/%s' % (self.getContextRoot(), username)
        self.logger.debug('Retrieving principal for user %s' % (username))
        responseData = self.sendSessionRequest(url=url, method='GET')
        return AuthorizationPrincipal(responseData)

    @DsRestApi.execute
    def addSession(self, sessionId, sessionInfo):
        if sessionId is None:
            raise InvalidRequest('Session id must be provided.')
        if sessionInfo is None:
            raise InvalidRequest('Session info must be provided.')
        url = '%s/sessions/%s' % (self.getContextRoot(), sessionId)
        url += '?sessionInfo=%s' % Encoder.encode(json.dumps(sessionInfo))
        responseData = self.sendSessionRequest(url=url, method='POST')
        return DmSession(responseData)

    @DsRestApi.execute
    def checkSession(self, sessionId):
        if sessionId is None:
            raise InvalidRequest('Session id must be provided.')
        url = '%s/sessions/%s' % (self.getContextRoot(), sessionId)
        responseData = self.sendSessionRequest(url=url, method='PUT')
        return DmSession(responseData)

#######################################################################
# Testing.

if __name__ == '__main__':
    api = AuthRestApi('dm', 'dm', 'zagreb.svdev.net', 22236, 'http')
    print api.authenticateUser('sveseli', 'sv')