<?php
//namespace istic-openstack\Server\core;
use OpenCloud\Common\Error;

class compute 
{
        /** @var App $app protected, contains the main app object */
        protected $app;

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


	    public function __construct($app)
    	{
       	         $this->app = $app;
        	 $this->libClass = $app->getLibClass("Compute");
    	}
	/**
	* Execute an action
	*
	* @param String $action name of another function of this class
	*
	* @return void
	*/
	public function action($action){
		
		 $this->{$action.""}();
		
	}
    	/**
     	* List servers.
     	* @return array
     	*/
        public function listServers()
        {
                $serverList = $this->libClass->listServers(true);
		$servers = Array();
		foreach($serverList as $server){
		$servers[$server->id] = Array();
		$server->flavor->retrieve();
		$server->image->retrieve();
		$server->retrieve();
		$servers[$server->id]["id"]  = $server->id;
		$servers[$server->id]["name"] = $server->name;
		$servers[$server->id]["image"] = $server->image; 
		$servers[$server->id]["ram"] = $server->flavor->ram;
		$servers[$server->id]["disk"] = $server->flavor->disk;
		$servers[$server->id]["flavor"] = $server->flavor; 
		$servers[$server->id]["status"] = $server->status;
		$servers[$server->id]["created"] = $server->created;
		$servers[$server->id]["updated"] = $server->updated;
		$servers[$server->id]["ipv4"] = $server->ipv4;
		$servers[$server->id]["ipv6"] = $server->ipv6;
		$servers[$server->id]["progress"] = $server->progress;
		$servers[$server->id]["hostId"] = $server->hostId;
		$servers[$server->id]["tenantId"] = $server->tenantId;
		$servers[$server->id]["userId"] = $server->userId;
		$servers[$server->id]["taskState"] = $server->taskState;
		$servers[$server->id]["addresses"] = $server->addresses;
		$servers[$server->id]["links"] = $server->links;
		$servers[$server->id]["metadata"] = $server->metadata;
		}
		$this->app->setOutput("Servers", $servers);
                return;
        }
        /**
         * List flavors.
         * @return array
         */
        public function listFlavors()
        {
                $flavorList = $this->libClass->listFlavors();
		$flavors = Array();
		foreach($flavorList as $flavor){
		$flavors[$flavor->id] = Array();
		$flavor->retrieve();
		$flavors[$flavor->id]["id"]  = $flavor->id;
		$flavors[$flavor->id]["name"] = $flavor->name;
		$flavors[$flavor->id]["ram"] = $flavor->ram;
		$flavors[$flavor->id]["disk"] = $flavor->disk;
		$flavors[$flavor->id]["vcpus"] = $flavor->vcpus;
		$flavors[$flavor->id]["links"] = $flavor->links;
		}
		$this->app->setOutput("Flavors", $flavors);
                return;
        }
        /**
         * List images.
         * @return array
         */
        public function listImages()
        {
                $imageList = $this->libClass->listImages();
		$images = Array();
		foreach($imageList as $image){
		$images[$image->id] = Array();
		$image->retrieve();
		$images[$image->id]["id"]  = $image->id;
		$images[$image->id]["name"] = $image->name;
		$images[$image->id]["status"] = $image->status;
		$images[$image->id]["created"] = $image->created;
		$images[$image->id]["updated"] = $image->updated;
		$images[$image->id]["minDisk"] = $image->minDisk;
		$images[$image->id]["minRam"] = $image->minRam;
		$images[$image->id]["progress"] = $image->progress;
		$images[$image->id]["links"] = $image->links;
		$images[$image->id]["metadata"] = $image->metadata;
		}
		$this->app->setOutput("Images", $images);
                return;
        }
       /**
         * Get server details.
         * @return array
         */
        public function getServer()
        {
		$serverId = $this->app->getPostParam("serverId");
		if(!isset($serverId)){
			$this->app->setOutput("Error", "Server ID is missing, son!");
			return;
		}
		$opt = array('id' => $serverId);
                $server = $this->libClass->getServer($opt);
		$server->retrieve();
		$this->app->setOutput("MyServer", $server);
                return;
        }
        /**
         * Get flavor details.
         * @return array
         */
        public function getFlavor()
        {
		$flavorId = $this->app->getPostParam("flavorId");
		if(!isset($serverId)){
			$this->app->setOutput("Error", "Flavor ID is missing, son!");
			return;
		}
		$opt = array('id' => $flavorId);
                $flavor = $this->libClass->getFlavor($opt);
		$flavor->retrieve();
		$this->app->setOutput("MyFlavor", $flavor);
                return;
        }
        /**
         * Get image details.
         * @return array
         */
        public function getImage()
        {
		$imageId = $this->app->getPostParam("imageId");
		if(!isset($serverId)){
			$this->app->setOutput("Error", "Image ID is missing, son!");
			return;
		}
		$opt = array('id' => $imageId);
                $image = $this->libClass->getImage($opt);
		$image->retrieve();
		$this->app->setOutput("MyImage", $image);
                return;
        }
        /**
         * Create server.
         * @return array
         */ 
        public function createServer()
        {
		$name = $this->app->getPostParam("name");
		$imageId = $this->app->getPostParam("imageId");
		$flavorId = $this->app->getPostParam("flavorId");
		if(!isset($name) || !isset($imageId) || !isset($flavorId)){
			$this->app->setOutput("Error", "No, we don't let you create a server without a name OR image ID OR flavor ID.");
			return;
		}
		$opt = array('name' => $name, 'imageId' => $imageId, 'flavorId' => $flavorId);
                $server = $this->libClass->createServer($opt);
        }
 
	/**
	* update a server
	* @return void
	*/
        public function updateServer()
        {
               	$serverId = $this->app->getPostParam("serverId");
               	$newName = $this->app->getPostParam("newName");
               	$newIpv4 = $this->app->getPostParam("newIpv4");
               	$newIpv6 = $this->app->getPostParam("newIpv6");
		if(!isset($serverId)|| !(isset($newName) || isset($newIpv4) || isset($newIpv6)) ){
			$this->app->setOutput("Error", "You'll have to provide server ID and the new attribute(IP(v4/v6)/Name) you desire to update!");
			return;
		}
		$opt = array('id' => $serverId);
                $server = $this->libClass->getServer($opt);
		if (isset($newName)){
			if(isset($newIpv4)){
				if(isset($newIpv6)){
					$attr = array('name' => $newName, 'accessIPv4' => $newIPv4, 'accessIPv6' => $newIpv6); 
				}
				else $attr = array('name' => $newName, 'accessIPv4' => $newIPv4); 
			}
			else $attr = array('name' => $newName); 
		}			
		$server->update($attr);
		$this->app->setOutput("Success", $serverId." has been updated successfully.");
                return;
        }
	/**
	* Delete a server
	* @return void
	*/
        public function deleteServer()
        {
               	$serverId = $this->app->getPostParam("serverId");
		if(!isset($serverId)){
			$this->app->setOutput("Error", "Server ID is missing, son!");
			return;
		}
		$opt = array('id' => $serverId);
                $server = $this->libClass->getServer($opt);
		$server->delete();
		$this->app->setOutput("Success", $serverId." has been deleted successfully.");
                return;
        }
	/**
	* Change the password of a server
	* @return void
	*/
        public function changePassword()
        {
		$serverId = $this->app->getPostParam("serverId");
		$password = $this->app->getPostParam("newPassword");
		if(!isset($serverId) || !isset($password)){
			$this->app->setOutput("Error", "Server ID or new password missing.");
			return;
		}
		$opt = array('id' => $serverId);
                $server = $this->libClass->getServer($opt);
		$server->changePassword($password);	
		$this->app->setOutput("Success", "Password for ".$serverId." has been updated successfully.");
		return;
        }
        /**
	* Reboot a server
	* @return void
	*/
        public function reboot()
        {
               	$serverId = $this->app->getPostParam("serverId");
		if(!isset($serverId)){
			$this->app->setOutput("Error", "Server ID is missing, son!");
			return;
		}
		$opt = array('id' => $serverId);
                $server = $this->libClass->getServer($opt);
		$server->reboot();
		$this->app->setOutput("Success", $serverId." has been deleted successfully.");
                return;
        }
       	/**
	* Rebuild a server
	* @return void
	*/
        public function rebuild()
        {
               	$serverId = $this->app->getPostParam("serverId");
               	$imageId = $this->app->getPostParam("imageId");
               	$newName = $this->app->getPostParam("newName");
               	$adminPass = $this->app->getPostParam("adminPass");
		if(!isset($serverId)|| !isset($imageId) || isset($newName) || isset($adminPass)) {
			$this->app->setOutput("Error", "You'll have to provide server ID and the new image, name and admin password!");
			return;
		}
		$opt = array('id' => $serverId);
                $server = $this->libClass->getServer($opt);
		$attr = array('imageId' => $imageId, 'name' => $newName, 'adminPass' => $adminPass); 
		$server->rebuild($attr);
		$this->app->setOutput("Success", $serverId." has been rebuilt successfully with the new image.");
                return;
        }
       	/**
	* Resize a server
	* A call to this method has to be followed by either confirmResize or revertResize
	* @return void
	*/
        public function resize()
        {
               	$serverId = $this->app->getPostParam("serverId");
               	$newFlavorId = $this->app->getPostParam("newFlavorId");
		if(!isset($serverId)|| !isset($flavorId)){
			$this->app->setOutput("Error", "You'll have to provide server ID and the new flavor ID!");
			return;
		}
		$opt = array('id' => $serverId);
                $server = $this->libClass->getServer($opt);
		$server->resize($newFlavorId);
                return;
        }
        /**
	* Confirm resize operation on a server
	* @return void
	*/
        public function confirmResize()
        {
               	$serverId = $this->app->getPostParam("serverId");
		if(!isset($serverId)){
			$this->app->setOutput("Error", "Server ID is missing!");
			return;
		}
		$opt = array('id' => $serverId);
                $server = $this->libClass->getServer($opt);
		$server->confirmResize();
		$this->app->setOutput("Success", $serverId." has been resized successfully as the new flavor.");
                return;
        }
        /**
	* Revert resize operation on a server
	* @return void
	*/
        public function revertResize()
        {
               	$serverId = $this->app->getPostParam("serverId");
		if(!isset($serverId)){
			$this->app->setOutput("Error", "Server ID is missing!");
			return;
		}
		$opt = array('id' => $serverId);
                $server = $this->libClass->getServer($opt);
		$server->revertResize();
		$this->app->setOutput("Success", $serverId." : resize operation has been reverted to the old flavor.");
                return;
        }
	/*
        public function createImage(array $options)
        {
                //TODO
        }
        public function listAddresses(array $options = [])
        {
                //TODO
        }
        public function getMetadata()
        {
                //TODO
        }
        public function resetMetadata(array $metadata)
        {
                //TODO
        }
        public function mergeMetadata(array $metadata)
        {
                //TODO
        }
        public function getMetadataItem($key)
        {
                //TODO
        }
        public function deleteMetadataItem($key)
        {
                //TODO
        }
*/
}