<?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();

	/**
	 * Form info for admins to update
	 */
	abstract public function admin_update();

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

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

	/**
	 * 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());
	}

	/**
	 * View details of the service
	 */
	abstract public function service_view();

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

	public function manage_button() {
		if (! $this->service->status)
			return FALSE;

		static $k = '';

		// If $k is already set, we've rendered this JS
		if ($k)
			return TRUE;

		$k = Random::char();
		Session::instance()->set('manage_button',$k);

		Script::add(array('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: "'.$k.'",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;
	}

	/**
	 * 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));
		}
	}
}
?>