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

/**
 * This class supports Service Plugins.
 *
 * @package    Service
 * @category   Models
 * @author     Deon George
 * @copyright  (c) 2009-2013 Open Source Billing
 * @license    http://dev.osbill.net/license.html
 */
abstract class Model_Service_Plugin extends ORM_OSB {
	// Reset any sorting that may be defined in our parent
	protected $_sorting = array();

	protected $_belongs_to = array(
		'service'=>array(),
	);

	/**
	 * When does our service expire
	 */
	abstract public function expire();

	/**
	 * Our service name as defined in the DB
	 */
	abstract public function name();

	/**
	 * The table attributes that provide username/password values
	 */
	abstract public function password();
	abstract public function username();

	/**
	 * Provide the button that launches the management of this service, generally from a 3rd party
	 */
	protected function manage() {
		// Dont show the manage button for expired or inactive services
		if (! $this->service->status OR $this->service->expiring() OR $this->service->external_billing)
			return FALSE;

		static $x = '';

		// If $x is already set, we've rendered this JS
		if (! $x) {
			$x = Random::char();

			Session::instance()->set('manage_button',$x);

			Script::factory()
				->type('stdin')
				->data('
$(document).ready(function() {
	var x=0;

	$("button[name=submit]").click(function() {
		var t=$(this).val().split(":");
		if (x++) { alert("Session expired, please refresh the page!"); return false; }

		$.getJSON("'.URL::link('user','service/ajaxmanage/'.$this->service_id,TRUE).'", { k: "'.$x.'",t: t[1] },
			function(data) {$.each(data, function(key, val) { $("#"+key+"_"+t[0]+"_"+t[1]).val(val); }); })
			.error(function() { alert("There was a problem with the request"); return false; })
			.success(function() { $("form[id=id_"+t[0]+"_"+t[1]+"]").submit(); });
	});
});'
				);
		}

		return TRUE;
	}

	/**
	 * Return the name of the plugin
	 */
	protected function plugin() {
		return strtolower(preg_replace('/(.*)_([a-zA-Z]+)$/',"$2",get_class($this)));
	}

	/**
	 * Form info for admins to update plugin data
	 */
	public function render_edit() {
		return View::factory(sprintf('service/admin/plugin/%s/edit',$this->plugin()))
			->set('o',$this);
	}

	/**
	 * View details of the service
	 */
	public function render_view() {
		return View::factory(sprintf('service/user/plugin/%s/view',$this->plugin()))
			->set('o',$this);
	}

	/**
	 * Show our service name as defined in the DB with product suffix.
	 */
	public function service_name() {
		return sprintf('%s - %s',$this->service->product->title(),$this->name());
	}

	/**
	 * Get specific service details for use in other modules
	 * For Example: Invoice
	 *
	 * @todo Make the rendered items configurable
	 * @todo Change this method name, now that it is public
	 */
	public function _details($type) {
		switch ($type) {
			// Nothing to add for invoices
			case 'invoice_detail_items':
				return array();

			default:
				throw new Kohana_Exception('Unkown detail request :type',array(':type'=>$type));
		}
	}
}
?>
