#!/usr/bin/env python

import os
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.userInfo import UserInfo
from dm.common.objects.userExperimentRole import UserExperimentRole
from dsRestApi import DsRestApi

class UserRestApi(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 getUsers(self):
        url = '%s/users' % (self.getContextRoot())
        responseData = self.sendSessionRequest(url=url, method='GET')
        return self.toDmObjectList(responseData, UserInfo)

    @DsRestApi.execute
    def getUserById(self, id):
        if id is None:
            raise InvalidRequest('User id must be provided.')
        url = '%s/users/%s' % (self.getContextRoot(), id)
        responseData = self.sendSessionRequest(url=url, method='GET')
        return UserInfo(responseData)

    @DsRestApi.execute
    def getUserByUsername(self, username):
        if username is None:
            raise InvalidRequest('Username must be provided.')
        url = '%s/usersByUsername/%s' % (self.getContextRoot(), username)
        responseData = self.sendSessionRequest(url=url, method='GET')
        return UserInfo(responseData)

    @DsRestApi.execute
    def addUserExperimentRole(self, username, experimentName, roleName):
        if not username:
            raise InvalidRequest('Username must be provided.')
        if not experimentName:
            raise InvalidRequest('Experiment name must be provided.')
        if not roleName:
            raise InvalidRequest('Role name must be provided.')
        url = '%s/usersByExperiment/%s/%s/%s' % (self.getContextRoot(), username, experimentName, roleName)
        responseData = self.sendSessionRequest(url=url, method='POST')
        return UserExperimentRole(responseData)

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

if __name__ == '__main__':
    pass