<?php
/**
* File containing the identity Class.
*
*/

/**
* Import the Error of the Library
*/
use OpenCloud\Common\Error;

require_once("CoreInterface.php");
/**
* Identity Class of the back-end application
*
* This class implements the management for the identity request
*
* @version 1.0 Initialisation of this file
* @since 1.0 Core application's file
* 
* @author Eole 'eoledev at outlook . fr'
* 
*/
class identity implements Core{

	/** @var App $app protected, contains the main app object */
	protected $app;
	
	/** @var OpenStack\Identity $libClass protected, contains the library Identity object */
	protected $libClass;

	/**
	* identity constructor
	*
	* @param App $app the main app object
	*
	* @return identity Object
	*/
	public function __construct($app){

		$this->app = $app;
		$this->libClass = $app->getLibClass("Identity");

	}	
	
	/**
	* Execute an action
	*
	* @param String $action name of another function of this class
	*
	* @return void
	*/
	public function action($action){
		
		$this->{$action.""}();
		
	}
	/**
	* Add a credential for the given user/project.
	*
	* Create a secret/access pair for use with ec2 style auth.
	* This operation will generates a new set of credentials that map the user/project pair.
	*
	* @param JsonString $blob Required credentials information with this structure for ec2: "{\"access\":\"181920\",\"secret\":\"secretKey\"}"
	* @param String $projectId Required project's UUID
	* @param String $type Required Type of credential : ec2, cert...
	* @param String $userId Required Id of the user which own the credential
	*
	* @return void
	*/
	private function addCredential(){
		
		$blob = $this->app->getPostParam("blob");
		$projectId = $this->app->getPostParam("projectId");
		$type = $this->app->getPostParam("type");
		$userId = $this->app->getPostParam("userId");
		
		if(!isset($blob) || !isset($projectId) || !isset($type) || !isset($userId)){
			$this->app->setOutput("Error", "Parameters Incorrect");
			return;
		}
		
		try{
			
			$opt = array('blob' => $blob, 'projectId' => $projectId, 'type' => $type, 'userId' => $userId);
			$res = $this->libClass->createCredential($opt);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
		
	}
	
	/**
	* List the credentials for a given user.
	*
	* @return void
	*/
	private function listCredentials(){
		try{
			
			$this->libClass->listCredentials()
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
		
	}
	
	/**
	* Retrieve a user’s access/secret pair by the access key.
	*
	* @param String $credentialId Required credential id for which it retrieve the details
	*
	* @return void
	*/
	private function showCredential(){
		$credentId = $this->app->getPostParam("credentialId");
		
		if(!isset($credentId)){
			$this->app->setOutput("Error", "Parameters Incorrect");
		}
		
		try{
			
			$cred = $this->libClass->getCredential($credentId);
			$cred->retrieve();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
		
	}
	
	/**
	* Update a user’s access/secret pair.
	*
	* @param String $credentialId Required credential id to update
	* @param JsonString $blob Required credentials information with this structure for ec2: "{\"access\":\"181920\",\"secret\":\"secretKey\"}"
	* @param String $type Required Type of credential : ec2, cert...
	*
	* @return void
	*/
	private function updateCredential(){
		
		$credentId = $this->app->getPostParam("credentialId");
		$blob = $this->app->getPostParam("blob");
		$type = $this->app->getPostParam("type");
		
		if(!isset($blob) || !isset($credentId) || !isset($type)){
			$this->app->setOutput("Error", "Parameters Incorrect");
		}
		
		
		try{
			
			$credential = $this->libClass->getCredential($credentId);

			$credential->type = $type;
			$credential->blob = $blob;

			$credential->update();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Delete a user’s access/secret pair.
	*
	* @param String $credentialId Required credential id to delete
	*
	* @return void
	*/
	private function deleteCredential(){
		
		$credentId = $this->app->getPostParam("credentialId");
		
		if(!isset($credentId)){
			$this->app->setOutput("Error", "Parameters Incorrect");
		}
		
		try{
			
			$credential = $this->libClass->getCredential($credentId);
			$credential->delete();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
		
	}-
	
	/**
	* Add a domain to an OpenStack instance.
	*
	* @param String $desc Optional Domain Description
	* @param String $enabled Optional Domain enabled or not : value true or false
	* @param String $name Required Domain Name
	*
	* @return void
	*/
	private function addDomain(){
		
		$description = $this->app->getPostParam("desc");
		$enabled = $this->app->getPostParam("enabled");
		$name = $this->app->getPostParam("name");
		
		if(!isset($name)){
			$this->app->setOutput("Error", "Parameters Incorrect");
			return;
		}
		
		if(isset($enabled) && isset($description))
		$opt = array('description' => $description, 'enabled' => $enabled, 'name' => $name);
		elseif(isset($enabled))
		$opt = array('enabled' => $enabled, 'name' => $name);
		elseif(isset($description))
		$opt = array('description' => $description, 'name' => $name);
		else
		$opt = array('name' => $name);
		
		try{
			
			$res = $this->libClass->createCredential($opt);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
		
	}
	
	/**
	* Retrieve the different domain's list.
	*
	* @return void
	*/
	private function listDomains(){
		
		try{
			
			$this->libClass->listDomains()
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
		
	}
	
	/**
	* Retrieve the details of a given domain.
	*
	* @param String $domainId Required Domain id for which it retrieve the details
	*
	* @return void
	*/
	private function showDomain(){
		
		$domId = $this->app->getPostParam("domainId");
		
		if(!isset($domId)){
			$this->app->setOutput("Error", "Parameters Incorrect");
		}
		
		try{
			
			$domain = $this->libClass->getDomain($domId);
			$domain->retrieve();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Update the given domain.
	*
	* @param String $domainId Required domain id to update
	* @param String $desc Optional Domain Description
	* @param String $enabled Optional Domain enabled or not : value true or false
	* @param String $name Required Domain Name
	*
	* @return void
	*/
	private function updateDomain(){
		
		$domId = $this->app->getPostParam("domainId");
		$description = $this->app->getPostParam("desc");
		$enabled = $this->app->getPostParam("enabled");
		$name = $this->app->getPostParam("name");
		
		if(!isset($domId)){
			$this->app->setOutput("Error", "Parameters Incorrect");
			return;
		}
		
		
		try{
			
			$domain = $this->libClass->getDomain($domId);

			if(isset($name))
			$domain->name = $name;
			if(isset($enabled))
			$domain->enabled = $enabled;
			if(isset($description))
			$domain->description = $description;

			$domain->update();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Delete the given domain.
	*
	* @param String $domainId Required Domain id to delete
	*
	* @return void
	*/
	private function deleteDomain(){
		
		$domId = $this->app->getPostParam("domainId");
		
		if(!isset($domId)){
			$this->app->setOutput("Error", "Parameters Incorrect");
		}
		
		try{
			
			$domain = $this->libClass->getDomain($domId);
			$domain->delete();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the different roles of a given user in a domain.
	*
	* @return void
	*/
	private function listRolesDomainUser(){
		
		$domId = $this->app->getPostParam("domainId");
		$userId = $this->app->getPostParam("userId");
		
		if(!isset($domId) || !isset($userId)){
			
		}
		
		try{
			
			$domain = $this->libClass->getDomain($domId);
			
			$domain->listUserRoles(['userId' => $userId]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Grant a role to a given user in a domain.
	*
	* @return void
	*/
	private function grantRoleDomainUser(){
		$domId = $this->app->getPostParam("domainId");
		$roleId = $this->app->getPostParam("roleId");
		$userId = $this->app->getPostParam("userId");
		
		if(!isset($domId) || !isset($roleId) || !isset($userId)){
			
		}
		
		try{
			
			$domain = $this->libClass->getDomain($domId);
			
			$domain->grantUserRole([
			'userId' => $userId,
			'roleId' => $roleId,
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Verify that a user has a given role in a domain.
	*
	* @return void
	*/
	private function checkRoleDomainUser(){
		$domId = $this->app->getPostParam("domainId");
		$roleId = $this->app->getPostParam("roleId");
		$userId = $this->app->getPostParam("userId");
		
		if(!isset($domId) || !isset($roleId) || !isset($userId)){
			
		}

		try{
			
			$domain = $this->libClass->getDomain($domId);

			$result = $domain->checkUserRole(['userId' => $userId, 'roleId' => $roleId]);
			
			/*if (true === $result) {
				// It exists!
			}*/
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Delete a role for a given user in a domain.
	*
	* @return void
	*/
	private function revokeRoleDomainUser(){
		$domId = $this->app->getPostParam("domainId");
		$roleId = $this->app->getPostParam("roleId");
		$userId = $this->app->getPostParam("userId");
		
		if(!isset($domId) || !isset($roleId) || !isset($userId)){
			
		}
		
		try{
			
			$domain = $this->libClass->getDomain($domId);

			$domain->revokeUserRole([
			'userId' => $userId,
			'roleId' => $roleId,
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the roles of a given group in a domain.
	*
	* @return void
	*/
	private function listRolesDomainGroup(){
		$domId = $this->app->getPostParam("domainId");
		$groupId = $this->app->getPostParam("groupId");
		
		if(!isset($domId) || !isset($groupId)){
			
		}


		try{
			
			$domain = $this->libClass->getDomain($domId);

			$domain->listGroupRoles(['groupId' => $groupId]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Add a role to a given group in a domain.
	*
	* @return void
	*/
	private function grantRoleDomainGroup(){
		$domId = $this->app->getPostParam("domainId");
		$groupId = $this->app->getPostParam("groupId");
		$roleId = $this->app->getPostParam("roleId");
		
		if(!isset($domId) || !isset($groupId) || !isset($roleId)){
			
		}

		try{
			
			$domain = $this->libClass->getDomain($domId);

			$domain->grantGroupRole([
			'groupId' => $groupId,
			'roleId'  => $roleId,
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Verify that a role is associated with a given group in a domain.
	*
	* @return void
	*/
	private function checkRoleDomainGroup(){
		$domId = $this->app->getPostParam("domainId");
		$groupId = $this->app->getPostParam("groupId");
		$roleId = $this->app->getPostParam("roleId");
		
		if(!isset($domId) || !isset($groupId) || !isset($roleId)){
			
		}

		try{
			
			$domain = $this->libClass->getDomain($domId);

			$result = $domain->checkGroupRole(['groupId' => $groupId, 'roleId' => $roleId]);
			
			/*if (true === $result) {
				// It exists!
			}*/
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Delete a role for a given group in a domain.
	*
	* @return void
	*/
	private function revokeRoleDomainGroup(){
		$domId = $this->app->getPostParam("domainId");
		$groupId = $this->app->getPostParam("groupId");
		$roleId = $this->app->getPostParam("roleId");
		
		if(!isset($domId) || !isset($groupId) || !isset($roleId)){
			
		}
		
		try{
			
			$domain = $this->libClass->getDomain($roleId);

			$domain->revokeGroupRole([
			'groupId' => $groupId,
			'roleId'  => $roleId,
			]);

			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Add an endpoint to the Openstack instance
	*
	* @return void
	*/
	private function addEndpoint(){
		$servId = $this->app->getPostParam("serviceId");
		$name = $this->app->getPostParam("name");
		$region = $this->app->getPostParam("region");
		$url = $this->app->getPostParam("url");
		
		if(!isset($servId) || !isset($name) || !isset($region) || !isset($url)){
			
		}
		
		try{
			
			$endpoint = $this->libClass->createEndpoint([
			'interface' => \OpenStack\Identity\v3\Enum::INTERFACE_INTERNAL,
			'name'      => $name,
			'region'    => $region,
			'url'       => $url,
			'serviceId' => $servId
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the endpoint for the given id
	*
	* @return void
	*/
	private function getEndpoint(){
		
		$endId = $this->app->getPostParam("endpointId");
		
		if(!isset($endId)){
			
		}
		
		try{
			
			$endpoint = $this->libClass->getEndpoint($endId);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the list of the different endpoints
	*
	* @return void
	*/
	private function listEndpoints(){
		
		try{
			
			$res = $this->libClass->listEndpoints();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Update a given endpoint
	*
	* @return void
	*/
	private function updateEndpoint(){
		//Not Implemented Yet
	}
	
	/**
	* Delete a given endpoint
	*
	* @return void
	*/
	private function deleteEndpoint(){
		$endId = $this->app->getPostParam("endpointId");
		
		if(!isset($endId)){
			
		}
		
		try{
			
			$endpoint = $this->libClass->getEndpoint($endId);
			$endpoint->delete();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Add a group.
	*
	* @return void
	*/
	private function addGroup(){
		//Not Implemented Yet
	}
	
	/**
	* Retrieve the group's list.
	*
	* @return void
	*/
	private function listGroups(){
		//Not Implemented Yet
	}
	
	/**
	* Retrieve the details of a given group.
	*
	* @return void
	*/
	private function showGroup(){
		//Not Implemented Yet
	}
	
	/**
	* Update a given group.
	*
	* @return void
	*/
	private function updateGroup(){
		//Todo Argument Optional
		$groupId = $this->app->getPostParam("groupId");
		$description = $this->app->getPostParam("description");
		$name = $this->app->getPostParam("name");
		
		if(!isset($groupId)){
			
		}
		
		try{
			
			$group = $this->libClass->getGroup($groupId);

			if(isset($description))
			$group->description = 'foo';
			if(isset($name))
			$group->name = 'bar';
			
			$group->update();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Delete the given group.
	*
	* @return void
	*/
	private function deleteGroup(){
		
		$groupId = $this->app->getPostParam("groupId");
		
		if(!isset($groupId)){
			
		}
		
		try{
			
			$group = $this->libClass->getGroup($groupId);

			$group->delete();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the users of a given group.
	*
	* @return void
	*/
	private function listGroupUsers(){
		
		$groupId = $this->app->getPostParam("groupId");
		
		if(!isset($groupId)){
			
		}
		
		try{
			
			$group = $this->libClass->getGroup($groupId);

			$users = $group->listUsers();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Add a user to a group.
	*
	* @return void
	*/
	private function addGroupUser(){
		
		$userId = $this->app->getPostParam("userId");
		$groupId = $this->app->getPostParam("groupId");
		
		if(!isset($userId) || !isset($groupId)){
			
		}

		try{
			
			$group = $this->libClass->getGroup($groupId);

			$group->addUser(['userId' => $userId]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Remove a user from a given group.
	*
	* @return void
	*/
	private function removeGroupUser(){
		
		$userId = $this->app->getPostParam("userId");
		$groupId = $this->app->getPostParam("groupId");
		
		if(!isset($userId) || !isset($groupId)){
			
		}
		
		try{
			
			$group = $this->libClass->getGroup($groupId);

			$group->removeUser(['userId' => $userId]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Check if a group contains a given user.
	*
	* @return void
	*/
	private function checkGroupUser(){
		
		$userId = $this->app->getPostParam("userId");
		$groupId = $this->app->getPostParam("groupId");
		
		if(!isset($userId) || !isset($groupId)){
			
		}
		
		try{
			
			$group = $this->libClass->getGroup($groupId);

			$result = $group->checkMembership(['userId' => $userId]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* @todo
	*
	* @return void
	*/
	private function addPolicies(){
		//Not Implemented Yet
	}
	
	/**
	* @todo
	*
	* @return void
	*/
	private function listPolicies(){
		//Not Implemented Yet
	}
	
	/**
	* @todo
	*
	* @return void
	*/
	private function showPolicie(){
		//Not Implemented Yet
		
	}
	
	/**
	* @todo
	*
	* @return void
	*/
	private function updatePolicies(){
		//Not Implemented Yet
	}
	
	/**
	* @todo
	*
	* @return void
	*/
	private function deletePolicies(){
		//Not Implemented Yet
	}
	
	/**
	* Add a project.
	*
	* @return void
	*/
	private function addProject(){
		//Todo Parameters Optional
		$description = $this->app->getPostParam("description");
		$name = $this->app->getPostParam("name");
		
		if(!isset($name) || !isset($description)){
			
		}
		
		try{
			
			$project = $this->libClass->createProject([
			'description' => $description,
			'enabled'     => true,
			'name'        => $name
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the different projects.
	*
	* @return void
	*/
	private function listProjects(){
		
		try{
			
			$projects = $this->libClass->listProjects();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the details of a given project.
	*
	* @return void
	*/
	private function showProject(){
		
		$projId = $this->app->getPostParam("projetId");
		
		if(!isset($projId)){
			
		}
		
		try{
			
			$project = $this->libClass->getProject($projId);
			$project->retrieve();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Update a given project.
	*
	* @return void
	*/
	private function updateProject(){
		//Todo Parameters Optionnal
		$description = $this->app->getPostParam("description");
		$name = $this->app->getPostParam("name");
		$projId = $this->app->getPostParam("projetId");
		
		if(!isset($projId) || !isset($name) || !isset($description)){
			
		}
		
		try{
			
			$project = $this->libClass->getProject($projId);

			$project->enabled = false;
			$project->description = $description;
			$project->name = $name;
			
			$project->update();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Delete a given project.
	*
	* @return void
	*/
	private function deleteProject(){
		$projId = $this->app->getPostParam("projId");
		
		if(!isset($projId)){
			
		}

		try{
			
			$project = $this->libClass->getProject($projId);

			$project->delete();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* List the roles of a given user in a project.
	*
	* @return void
	*/
	private function listRolesProjectUser(){
		
		$projId = $this->app->getPostParam("projetId");
		$userId = $this->app->getPostParam("userId");
		
		if(!isset($projId) || !isset($userId)){
			
		}
		
		try{
			
			$project = $this->libClass->getProject($projId);

			$project->listUserRoles(['userId' => $userId]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Grant a role to an user in a project.
	*
	* @return void
	*/
	private function grantRoleProjectUser(){
		
		$projId = $this->app->getPostParam("projId");
		$userId = $this->app->getPostParam("userId");
		$roleId = $this->app->getPostParam("roleId");
		
		if(!isset($projId) || !isset($userId) || !isset($roleId)){
			
		}
		
		try{
			
			$project = $this->libClass->getProject($projId);

			$project->grantUserRole([
			'userId' => $userId,
			'roleId' => $roleId,
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Check if a given user has a role in a project.
	*
	* @return void
	*/
	private function checkRoleProjectUser(){
		$projId = $this->app->getPostParam("projetId");
		$userId = $this->app->getPostParam("userId");
		$roleId = $this->app->getPostParam("roleId");
		
		if(!isset($projId) || !isset($userId) || !isset($roleId)){
			
		}
		
		try{
			
			$project = $this->libClass->getProject($projId);

			$result = $project->checkUserRole([
			'userId' => $userId,
			'roleId' => $roleId,
			]);
			
			/*if (true === $result) {
			}*/
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Delete a role for a given user in a project.
	*
	* @return void
	*/
	private function revokeRoleProjectUser(){
		
		$projId = $this->app->getPostParam("projetId");
		$userId = $this->app->getPostParam("userId");
		$roleId = $this->app->getPostParam("roleId");
		
		if(!isset($projId) || !isset($userId) || !isset($roleId)){
			
		}
		
		try{
			
			$project = $this->libClass->getProject($projId);

			$project->revokeUserRole([
			'userId' => $userId,
			'roleId' => $roleId,
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* List the roles of a group in a project.
	*
	* @return void
	*/
	private function listRolesProjectGroup(){
		
		$projId = $this->app->getPostParam("projetId");
		$groupId = $this->app->getPostParam("groupId");
		
		
		if(!isset($projId) || !isset($groupId)){
			
		}
		
		try{
			
			$project = $this->libClass->getProject($projId);

			$project->listGroupRoles(['groupId' => $groupId]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Add a role to a group in a project.
	*
	* @return void
	*/
	private function grantRoleProjectGroup(){
		
		$projId = $this->app->getPostParam("projetId");
		$userId = $this->app->getPostParam("userId");
		$roleId = $this->app->getPostParam("roleId");
		
		if(!isset($projId) || !isset($userId) || !isset($roleId)){
			
		}
		
		try{
			
			$project = $this->libClass->getProject($projId);

			$project->grantUserRole([
			'userId' => $userId,
			'roleId' => $roleId,
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Check if a group has a given role in a project.
	*
	* @return void
	*/
	private function checkRoleProjectGroup(){
		
		$projId = $this->app->getPostParam("projetId");
		$userId = $this->app->getPostParam("userId");
		$roleId = $this->app->getPostParam("roleId");
		
		if(!isset($projId) || !isset($userId) || !isset($roleId)){
			
		}

		try{
			
			$project = $this->libClass->getProject($projId);

			$result = $project->checkGroupRole([
			'groupId' => $groupId,
			'roleId'  => $roleId,
			]);
			
			/*if (true === $result) {
			}*/
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Delete a role for a group in a project.
	*
	* @return void
	*/
	private function revokeRoleProjectGroup(){
		
		$projId = $this->app->getPostParam("projetId");
		$userId = $this->app->getPostParam("userId");
		$roleId = $this->app->getPostParam("roleId");
		
		if(!isset($projId) || !isset($userId) || !isset($roleId)){
			
		}
		
		try{
			
			$project = $this->libClass->getProject($projId);

			$project->revokeGroupRole([
			'groupId' => $groupId,
			'roleId'  => $roleId,
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Add a role.
	*
	* @return void
	*/
	private function addRole(){
		
		$name = $this->app->getPostParam("name");
		
		if(!isset($name)){
			
		}
		
		try{
			
			$role = $this->libClass->createRole([
			'name' => $name,
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* List the different roles
	*
	* @return void
	*/
	private function listRoles(){

		try{
			
			$roles = $this->libClass->listRoles();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* List the different assignments for a given role
	*
	* @return void
	*/
	private function listRoleAssignements(){
		
		try{
			
			$assignements = $this->libClass->listRoleAssignments();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Add a service.
	*
	* @return void
	*/
	private function addService(){
		$name = $this->app->getPostParam("name");
		$type = $this->app->getPostParam("type");
		
		if(!isset($name) || !isset($type)){
			
		}
		
		try{
			
			$service = $this->libClass->createService([
			'name' => $name,
			'type' => $type,
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the different services.
	*
	* @return void
	*/
	private function listServices(){
		
		try{
			
			$services = $this->libClass->listServices();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the details for a given service.
	*
	* @return void
	*/
	private function showService(){
		$servId = $this->app->getPostParam("serviceId");
		
		if(!isset($servId)){
			
		}
		
		try{
			
			$service = $this->libClass->getService($servId);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Delete a given service.
	*
	* @return void
	*/
	private function deleteService(){
		
		$servId = $this->app->getPostParam("serviceId");
		$groupId = $this->app->getPostParam("groupId");
		
		if(!isset($servId) || !isset($groupId)){
			
		}
		
		try{
			
			$service = $this->libClass->getService($servId);
			$service->delete();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Generate a new token for a given user id.
	*
	* @return void
	*/
	private function genTokenUserID(){
		
		$userId = $this->app->getPostParam("userId");
		$userPass = $this->app->getPostParam("userPassword");
		
		if(!isset($userId) || !isset($userPass)){
			
		}
		
		try{
			
			$token = $this->libClass->generateToken([
			'user' => [
			'id'       => $userId,
			'password' => $userPass
			]
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Generate a new token for a given user name.
	*
	* @return void
	*/
	private function genTokenUserName(){
		$username = $this->app->getPostParam("username");
		$userPass = $this->app->getPostParam("userPassword");
		$domId = $this->app->getPostParam("domainId");
		
		
		if(!isset($userId) || !isset($userPass) || !isset($domId)){
			
		}
		
		try{
			
			$token = $this->libClass->generateToken([
			'user' => [
			'name'     => $username,
			'password' => $userPass,
			'domain'   => [
			'id' => $domId
			]
			]
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Generate a new token from another token ID.
	*
	* @return void
	*/
	private function genTokenID(){
		
		$tokenId = $this->app->getPostParam("tokenId");
		$projectId = $this->app->getPostParam("projectId");
		
		if(!isset($tokenId) || !isset($projectId)){
			
		}
		
		try{
			
			$token = $this->libClass->generateToken([
			'tokenId' => $tokenId,
			'scope'   => ['project' => ['id' => $projectId]]
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Generate a new token scoped by a project ID.
	*
	* @return void
	*/
	private function genTokenScopedProjectID(){
		
		$userId = $this->app->getPostParam("userId");
		$userPass = $this->app->getPostParam("userPass");
		$projId = $this->app->getPostParam("projetId");
		
		if(!isset($userId) || !isset($projId) || !isset($userPass)){
			
		}
		
		try{
			
			$token = $this->libClass->generateToken([
			'user' => [
			'id'       => $userId,
			'password' => $userPass
			],
			'scope' => [
			'project' => ['id' => $projId]
			]
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Generate a new token scoped by a project name.
	*
	* @return void
	*/
	private function genTokenScopedProjectName(){
		
		$userId = $this->app->getPostParam("userId");
		$userPass = $this->app->getPostParam("userPass");
		$projName = $this->app->getPostParam("projetName");
		$domId = $this->app->getPostParam("domId");
		
		if(!isset($userId) || !isset($projName) || !isset($userPass) || !isset($domId)){
			
		}

		try{
			
			$token = $this->libClass->generateToken([
			'user' => [
			'id'       => $userId,
			'password' => $userPass
			],
			'scope' => [
			'project' => [
			'name' => $projName,
			'domain' => [
			'id' => $domId
			]
			]
			]
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Check if a token is validate.
	*
	* @return void
	*/
	private function validateToken(){
		
		$tokenId = $this->app->getPostParam("tokenId");
		
		if(!isset($tokenId)){
			
		}
		
		try{
			
			$result = $this->libClass->validateToken($tokenId);
			
			/*if (true === $result) {
				// It's valid!
			}*/
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Delete a given token.
	*
	* @return void
	*/
	private function revokeToken(){
		
		$tokenId = $this->app->getPostParam("tokenId");
		
		if(!isset($tokenId)){
			
		}
		
		try{
			
			$this->libClass->revokeToken($tokenId);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Add a new user.
	*
	* @return void
	*/
	private function addUser(){
		//Todo Optionnal Parameter
		$projId = $this->app->getPostParam("projId");
		$desc = $this->app->getPostParam("description");
		$email = $this->app->getPostParam("email");
		$name = $this->app->getPostParam("name");
		$pass = $this->app->getPostParam("pass");
		$domId = $this->app->getPostParam("domId");
		
		if(!isset($domId) || !isset($groupId)){
			
		}
		
		try{
			
			$user = $this->libClass->createUser([
			'defaultProjectId' => $projId,
			'description'      => $desc,
			'domainId'         => $domId,
			'email'            => $email,
			'enabled'          => true,
			'name'             => $name,
			'password'         => $pass
			]);
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the different users.
	*
	* @return void
	*/
	private function listUsers(){
		
		try{
			
			$users = $this->libClass->listUsers();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the details of a given user.
	*
	* @return void
	*/
	private function showUser(){
		
		$userId = $this->app->getPostParam("userId");
		
		if(!isset($userId)){
			
		}
		
		try{
			
			$user = $this->libClass->getUser($userId);
			$user->retrieve();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Update a given user.
	*
	* @return void
	*/
	private function updateUser(){
		
		$userId = $this->app->getPostParam("userId");
		$desc = $this->app->getPostParam("description");
		$name = $this->app->getPostParam("name");
		
		if(!isset($userId) || !isset($desc) || !isset($name)){
			
		}
		
		try{
			
			$user = $this->libClass->getUser($userId);

			$user->description = $desc;
			$user->name = $name;
			
			$user->update();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Delete a given user.
	*
	* @return void
	*/
	private function deleteUser(){
		
		$userId = $this->app->getPostParam("userId");
		
		if(!isset($userId)){
			
		}
		
		try{
			
			$user = $this->libClass->getUser($userId);
			$user->delete();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the groups which contains a given user.
	*
	* @return void
	*/
	private function listUserGroups(){
		
		$userId = $this->app->getPostParam("userId");
		
		if(!isset($userId)){
			
		}

		try{
			
			$user = $this->libClass->getUser($userId);
			
			$groups = $user->listGroups();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
	
	/**
	* Retrieve the projects which contains a given user.
	*
	* @return void
	*/
	private function listUserProjects(){
		
		$userId = $this->app->getPostParam("userId");
		
		if(!isset($userId)){
			
		}
		
		try{
			
			$user = $this->libClass->getUser($userId);

			$projects = $user->listProjects();
			
			//TODO parse answer
			
		}catch(BadResponseError $e){
			$this->app->getErrorInstance()->BadResponseHandler($e);
		}catch(UserInputError $e){
			$this->app->getErrorInstance()->UserInputHandler($e);
		}catch(BaseError $e){
			$this->app->getErrorInstance()->BaseErrorHandler($e);
		}catch(NotImplementedError $e){
			$this->app->getErrorInstance()->NotImplementedHandler($e);
		}catch(Exception $e){
			$this->app->getErrorInstance()->OtherException($e);
		}
	}
}
