<?php defined('SYSPATH') or die('No direct access allowed.');

/**
 * This class provides PLESK client support
 *
 * @package    Host
 * @category   Plugins
 * @author     Deon George
 * @copyright  (c) 2009-2013 Open Source Billing
 * @license    http://dev.osbill.net/license.html
 */
class Host_Plugin_Plesk_10 extends Host_Plugin_Plesk {
	protected $protocol = '1.6.3.0';

	// @todo Get these default "templates" values out of the DB
	private $_template = array(
		'client'=>array(
			'gen_info'=>array(),
			'stat'=>array(),
		),
		'domain'=>array(
			'gen_info'=>array(),
			'hosting'=>array(),
			'limits'=>array(),
			'stat'=>array(),
			'prefs'=>array(),
			'disk_usage'=>array(),
			'performance'=>array(),
			'subscriptions'=>array(),
			'permissions'=>array(),
			#'plan-items'=>array(), // protocol 1.6.3.1
		),
		'reseller'=>array(
			'gen-info'=>array(),
			'stat'=>array(),
		),
	);

	/**
	 * Get a Client Configuration
	 */
	public function cmd_getclient(Model_Service $so) {
		$this->init();
		$items = array_keys($this->_template['client']);

		$client = $this->packet->add_node('customer');
		$get = $client->add_node('get');
		$filter = $get->add_node('filter');
		$filter->add_node('login',$so->plugin()->host_username);
		$dataset = $get->add_node('dataset');
		foreach ($items as $k)
			$dataset->add_node($k);

		return $this->server_command($this->xml);
	}

	/**
	 * Get a DNS Configuration
	 */
	public function cmd_getdns(Model_Service $so) {
		$do = clone $this->cmd_getdomain($so);

		$this->init();
		$domain = $this->packet->add_node('dns');
		$get = $domain->add_node('get_rec');
		$filter = $get->add_node('filter');
		$filter->add_node('site-id',$do->id->value());

		return $this->server_command($this->xml);
	}

	/**
	 * Get Mail Configuration
	 */
	public function cmd_getmail(Model_Service $so) {
		$do = clone $this->cmd_getdomain($so);

		$this->init();
		$domain = $this->packet->add_node('mail');
		$get = $domain->add_node('get_prefs');
		$filter = $get->add_node('filter');
		$filter->add_node('site-id',$do->id->value());

		return $this->server_command($this->xml);
	}

	/**
	 * Get a Domain Configuration
	 */
	public function cmd_getdomain(Model_Service $so) {
		$this->init();
		$items = array_keys($this->_template['domain']);

		$domain = $this->packet->add_node('webspace');
		$get = $domain->add_node('get');
		$filter = $get->add_node('filter');
		$filter->add_node('name',strtolower($so->plugin()->name()));
		$dataset = $get->add_node('dataset');
		foreach ($items as $k)
			$dataset->add_node($k);

		return $this->server_command($this->xml);
	}

	/**
	 * Get Reseller
	 */
	public function cmd_getreseller(Model_Service $so) {
		$this->init();
		$items = array_keys($this->_template['reseller']);

		$hsao = ORM::factory('Host_Server_Affiliate',array('affiliate_id'=>$so->affiliate_id,'host_server_id'=>$so->plugin()->host_server_id))->find();

		if (! $hsao->loaded())
			return NULL;

		$domain = $this->packet->add_node('reseller');
		$get = $domain->add_node('get');
		$filter = $get->add_node('filter');
		$filter->add_node('login',strtolower($hsao->host_username));
		$dataset = $get->add_node('dataset');
		foreach ($items as $k)
			$dataset->add_node($k);

		return $this->server_command($this->xml);
	}

	/**
 	 * Get Domain Traffic
 	 */
 	public function cmd_gettraffic(Model_Service $so) {
		throw new Kohana_Exception('Not Implemented');
	}

	/**
	 * Disable Mail
	 */
	public function cmd_disablemail(Model_Service $so) {
		$do = clone $this->cmd_getdomain($so);

		$this->init();
		$domain = $this->packet->add_node('mail');
		$disable = $domain->add_node('disable');
		$disable->add_node('site-id',$do->id->value());

		return $this->server_command($this->xml);
	}

	/**
	 * Provision a hosting service
	 * @todo To implement
	 */
	public function provision(Model_Service $so) {
		$ro = clone $this->cmd_getreseller($so);

		// Make sure our reseller exists
		if ($ro AND ! $ro->id->value())
			throw new Kohana_Exception('Add Reseller - Not Implemented');

		// @todo If client already exists, skip this part...

		$result = $this->add_client($so);
		if (! $result->loaded()) {
			print_r(array('x'=>(string)$result->_xml,'o'=>(string)$result->_object));
			throw new Kohana_Exception('Failed to Add Client?');
		}

		// Provision Domain
		$result = $this->add_domain($so);
		if (! $result->loaded()) {
			print_r(array('x'=>(string)$result->_xml,'o'=>(string)$result->_object));
			throw new Kohana_Exception('Failed to Add Domain?');
		}

		echo (string)$result->_object;
	}

	public function add_client(Model_Service $so) {
		$ro = clone $this->cmd_getreseller($so);

		$this->init();
		$client = $this->packet->add_node('customer');
		$add = $client->add_node('add');
		$gen_info = $add->add_node('gen_info');
		$gen_info->add_node('cname',$so->account->company);
		$gen_info->add_node('pname',sprintf('%s %s',$so->account->first_name,$so->account->last_name));

		$gen_info->add_node('login',$so->plugin()->host_username);
		$gen_info->add_node('passwd',$so->plugin()->host_password);

		$gen_info->add_node('status',0);
		$gen_info->add_node('email',$so->account->email);

		if ($ro->id)
			$gen_info->add_node('owner-id',$ro->id->value());

		return $this->server_command($this->xml);
	}

	public function add_dnsdata(Model_Service $so,XML $dns) {
		$this->init();
		$this->packet->import($dns);

		return $this->server_command($this->xml);
	}

	public function add_domain(Model_Service $so) {
		$plan = 'Default Domain'; //@todo Get from other means.
		$co = clone $this->cmd_getclient($so);
		$ip = '223.27.16.147'; //@todo Get from other means.

		if (! $co->loaded())
			throw new Kohana_Exception('Unable to load Plesk Customer?');

		if (! $so->plugin()->ftp_username)
			throw new KOhana_Exception('FTP Username cannot be blank');

		$this->init();
		$domain = $this->packet->add_node('webspace');
		$add = $domain->add_node('add');
		$gen_setup = $add->add_node('gen_setup');
		$gen_setup->add_node('name',strtolower($so->name()));
		$gen_setup->add_node('owner-id',$co->id->value());
		$gen_setup->add_node('htype','vrt_hst');
		$gen_setup->add_node('ip_address',$ip);
		$gen_setup->add_node('status','0');

		$hosting = $add->add_node('hosting');
		$vrt_host = $hosting->add_node('vrt_hst');
		$property = $vrt_host->add_node('property');
		$property->add_node('name','ftp_login');
		$property->add_node('value',$so->plugin()->ftp_username);
		if ($so->plugin()->ftp_password) {
			$property = $vrt_host->add_node('property');
			$property->add_node('name','ftp_password');
			$property->add_node('value',$so->plugin()->ftp_password);
		}
		$vrt_host->add_node('ip_address',$ip);

		$add->add_node('plan-name',$plan);

		return $this->server_command($this->xml);
	}

	public function newitem(Model_Service $so,$type) {
		$this->init();

		return $this->packet->add_node($type);
	}

	public function setexpire(Model_Service $so,$date=NULL) {
		// @todo This should be a config item
		$expbuffer = 14;
		$this->init();

		$site = $this->packet->add_node('webspace');
		$set = $site->add_node('set');
		$filter = $set->add_node('filter');
		$filter->add_node('name',strtolower($so->plugin()->name()));
		$values = $set->add_node('values');
		$limits = $values->add_node('limits');
		$limit = $limits->add_node('limit');
		$limit->add_node('name','expiration');
		$limit->add_node('value',(is_null($date) ? $so->plugin()->host_expire+$expbuffer*86400 : $date));

		return $this->server_command($this->xml);
	}

	public function setpasswd(Model_Service $so,$pw) {
		$this->init();

		$client = $this->packet->add_node('customer');
		$set = $client->add_node('set');
		$filter = $set->add_node('filter');
		$filter->add_node('login',$so->plugin()->host_username);
		$values = $set->add_node('values');
		$gen_info = $values->add_node('gen_info');
		$gen_info->add_node('passwd',$pw);

		return $this->server_command($this->xml);
	}
}
?>
