<?php
/**
* File containing the Automating Class.
*
* @version 1.0 Initialisation of this file
* @since 1.0 Core application's file
* 
* @author Evan Pisani 'yogg at epsina . com' et bhupi
* 
* @todo Complete the functions with errors detection and finish the descriptions
*/

include("CoreInterface.php");
include("Image.php");
include("Network.php");
include("Compute.php");

class automating implements Core{

	/** @var App $app protected, contains the main app object */
	protected $appCompute;
	protected $appImage;
	protected $appNetwork;
	protected $appIdentity;
	
	/**
	* Our library's app constructor for all server app objects
	*
	* @param App $app the main app object, e.g. compute, image, network, etc.
	*
	* @return
	*/
	public function __construct($app){
		if(!isset($app)){
			$this->app->setOutput("Error", "Parameter app missing.");
		}
		$this->appCompute = $appCompute;
		$this->appImage = $appImage;
		$this->appNetwork = $appNetwork;
		$this->appIdentity = $appIdentity;
	}

	/**
	* Execute an action
	*
	* @param String $action name of another function of this class
	*
	* @return void
	*/
	public function action($action){
		 $this->{$action.""}();	
	}

	public function script()
	{
		appImage->createImage();
		appImage->create_network();
		appImage->list_network_ids();
		appImage->create_subnet();
		appCompute->listFlavors();
		appCompute->listImages();
		appCompute->createServer();
		
	}
	/**
	* Create a new image on a new server
	*
	* @param $name the name of the new image
	* @param $falvor_id the id of the flavor it will be used to create the new server 
	*
	* @return Image the new image created
	*/
	private function createImageOnNewServer(){
		try{
			/* POURRI
			$image = new Image($this->app);
			$compute = new Compute($this->app);
			
			$name = $this->app->getPostParam("name");
			$falvor_id = $this->app->getPostParam("falvor_id"); // Compris entre 1 et 5 (1=petit serveur, 5=gros serveur)

			$opt = Array();
			$opt['name'] = $name;
			$opt['visibility'] = 'public';
			$opt['minDisk'] = 100; // A VOIR 
			$opt['minRam'] = 128; // A VOIR
			$opt['protected'] = false;

			$this->app->setPostParam("opt", $opt);

			$image->action("createImage");
			$res = json_decode($this->app->show(), true)["Images"];


			$this->app->setPostParam("name", $name);
			$this->app->setPostParam("imageId", $res['id']);
			$this->app->setPostParam("flavorId", $falvor_id);

			$compute->action("createServer");
			*/
		}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);
        }
        //$this->app->setOutput("Auto", $res);
	}


	/**
	* Create a new image on an existing server
	*
	* @param $name the name of the new image
	* @param $server_id the id of the server
	*
	* @return Image the new image created
	*/
	private function createImageOnServer(){
		try{
			
		}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);
        }
	}
}

?>