<?php
/**
 * AgileBill - Open Billing Software
 *
 * This body of work is free software; you can redistribute it and/or
 * modify it under the terms of the Open AgileBill License
 * License as published at http://www.agileco.com/agilebill/license1-4.txt
 *
 * Originally authored by Tony Landis, AgileBill LLC
 *
 * Recent modifications by Deon George
 *
 * @author Deon George <deonATleenooksDOTnet>
 * @copyright 2009 Deon George
 * @link http://osb.leenooks.net
 *
 * @link http://www.agileco.com/
 * @copyright 2004-2008 Agileco, LLC.
 * @license http://www.agileco.com/agilebill/license1-4.txt
 * @author Tony Landis <tony@agileco.com>
 * @package AgileBill
 * @subpackage Modules:Product
 */

/**
 * The main AgileBill Base Product Plugin Class
 *
 * @package AgileBill
 * @subpackage Modules:Product
 */
abstract class base_product_plugin {
	# Plugin Name
	protected $name	= '';
	# If this plugin provisions remote services
	public $remote_based = false;
	# Account Using this Plugin
	protected $account;
	# Product this Plugin is Refering
	protected $product;
	# Product Actributes
	protected $product_attr;

	/**
	 * Provision new service
	 *
	 * Some available variables:
	 * * All the fields on the account table, eg: id,username,email,first_name,last_name
	 *   $this->account['username'];
	 * * All the fields in the service table, eg: id,host_username,host_password
	 *   $this->service['id'];
	 * * All the fields captured by the custom product plugin configuration template
	 *   $this->plugin_data['my_field'];
	 */
	protected function p_new() {
		# Do some background logging of what is going on
		global $C_debug;
		$C_debug->error(__FILE__,__METHOD__,print_r(array($this->plugin_data,$this->service),true));

		return true;
	}

	/**
	 * Modify service
	 */
	protected function p_edit() {
		# Do some background logging of what is going on
		global $C_debug;
		$C_debug->error(__FILE__,__METHOD__,print_r(array($this->plugin_data,$this->service),true));

		return true;
	}

	/**
	 * Suspend service
	 */
	protected function p_inactive() {
		# Do some background logging of what is going on
		global $C_debug;
		$C_debug->error(__FILE__,__METHOD__,print_r(array($this->plugin_data,$this->service),true));

		return true;
	}

	/**
	 * Activate service
	 */
	protected function p_active() {
		# Do some background logging of what is going on
		global $C_debug;
		$C_debug->error(__FILE__,__METHOD__,print_r(array($this->plugin_data,$this->service),true));

		return true;
	}

	/**
	 * Delete service
	 */
	protected function p_delete() {
		# Do some background logging of what is going on
		global $C_debug;
		$C_debug->error(__FILE__,__METHOD__,print_r(array($this->plugin_data,$this->service),true));

		return true;
	}

	/**
	 * Delete items from a cart
	 * Return is not used
	 */
	public function delete_cart($VAR,$cart) {
		return;
	}

	/**
	 * Validate items added to cart
	 */
	public function validate_cart($VAR,$cart) {
		return true;
	}

	/**
	 * Process a Service
	 */
	public function p_one($id) {
		global $C_debug;

		$db = &DB();

		/* Get the service details */
		$rs = $db->Execute(sqlSelect($db,'service','*',sprintf('id=::%s::',$id)));
		if (! $rs || ! $rs->RecordCount())
			return false;

		$this->service = $rs->fields;
		@$this->plugin_data = unserialize($this->service['prod_plugin_data']);
		@$this->prod_attr_cart = unserialize($this->service['prod_attr_cart']);

		# Get the account details
		$acct = $db->Execute(sqlSelect($db,'account','*',sprintf('id=::%s::',$this->service['account_id'])));
		if ($acct && $acct->RecordCount())
			$this->account = $acct->fields;

		# Get the product details
		if (! empty($this->service['product_id'])) {
			$product = $db->Execute(sqlSelect($db,'product','*',sprintf('id = ::%s::',$this->service['product_id'])));
			$this->product = $product->fields;
			@$this->product_attr = unserialize($product->fields['prod_plugin_data']);
		}

		# Determine the correct action
		switch ($this->service['queue']) {
			case 'new':
				$result = $this->p_new();
				break;

			case 'active':
				$result = $this->p_active();
				break;

			case 'inactive':
				$result = $this->p_inactive();
				break;

			case 'edit':
				if ($this->service['active'] == 1)
					$this->p_active();
				else
					$this->p_inactive();

				$result = $this->p_edit();

				break;

			case 'delete':
				$result = $this->p_delete();

				break;

			default:
				$result = false;
		}

		if ($result) {
			$sql = sprintf("UPDATE %sservice SET queue='none', date_last=%s WHERE id =%s AND site_id=%s",
				AGILE_DB_PREFIX,$db->qstr(time()),$db->qstr($rs->fields['id']),$db->qstr(DEFAULT_SITE));
			$db->Execute($sql);

		} else {
			$C_debug->error($this->name.'php', $this->service['queue'], @$result);
		}
	}
}
?>