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

/**
 * This class provides Affiliate Service functions
 *
 * @package    OSB
 * @subpackage Service
 * @category   Controllers/Affiliate
 * @author     Deon George
 * @copyright  (c) 2010 Open Source Billing
 * @license    http://dev.osbill.net/license.html
 */
class Controller_Affiliate_Service extends Controller_TemplateDefault_Affiliate {
	protected $secure_actions = array(
		'list'=>TRUE,
		'listbycheckout'=>TRUE,
		'listadslservices'=>TRUE,
		'listdomainservices'=>TRUE,
		'listhostservices'=>TRUE,
		'listhspaservices'=>TRUE,
	);

	/**
	 * Show a list of services
	 */
	public function action_list() {
		Block::add(array(
			'title'=>_('Customer Services'),
			'body'=>Table::display(
				$this->filter(ORM::factory('service')->list_active(),$this->ao->affiliate->id),
				25,
				array(
					'id'=>array('label'=>'ID','url'=>'user/service/view/'),
					'service_name()'=>array('label'=>'Details'),
					'recur_schedule'=>array('label'=>'Billing'),
					'price(TRUE,TRUE)'=>array('label'=>'Price','class'=>'right'),
					'active'=>array('label'=>'Active'),
					'account->accnum()'=>array('label'=>'Cust ID'),
					'account->name()'=>array('label'=>'Customer'),
				),
				array(
					'page'=>TRUE,
					'type'=>'select',
					'form'=>'user/service/view',
				)),
			));
	}

	/**
	 * List all services by their default checkout method
	 */
	public function action_listbycheckout() {
		$svs = array();
		// @todo This needs to be configurable
		$go = ORM::factory('group',array('name'=>'Personal'));

		foreach (ORM::factory('account')->where('status','=',1)->find_all() as $ao)
			if ($ao->has_any('group',array($go)))
				foreach ($this->filter($ao->service->list_active(),$this->ao->affiliate->id,'name()') as $so)
					if (! $so->service_billing->checkout_plugin_id)
						array_push($svs,$so);

		if ($svs)
			Block::add(array(
				'title'=>'Services that should be auto-billed',
				'body'=>Table::display(
					$svs,
					25,
					array(
						'id'=>array('label'=>'ID','url'=>'user/service/view/'),
						'service_name()'=>array('label'=>'Details'),
						'recur_schedule'=>array('label'=>'Billing'),
						'price(TRUE,TRUE)'=>array('label'=>'Price','class'=>'right'),
						'active'=>array('label'=>'Active'),
						'account->accnum()'=>array('label'=>'Cust ID'),
						'account->name()'=>array('label'=>'Customer'),
					'date_next_invoice'=>array('label'=>'Next Invoice'),
						'account->invoices_due_total(NULL,TRUE)'=>array('label'=>'Due Invoices'),
					),
					array(
						'page'=>TRUE,
						'type'=>'select',
						'form'=>'user/service/view',
					)),
				));
		else
			Block::add(array(
				'title'=>'Services that should be auto-billed',
				'body'=>_('None found'),
			));

		foreach (ORM::factory('checkout')->where('active','=',1)->find_all() as $co) {
			$svs = array();

			foreach ($co->account->find_all() as $ao)
				foreach ($this->filter($ao->service->list_active(),$this->ao->affiliate->id,'name()') as $so)
					if ($so->service_billing->checkout_plugin_id == $co->id)
						array_push($svs,$so);

			if ($svs)
				Block::add(array(
					'title'=>$co->name,
					'body'=>Table::display(
						$svs,
						25,
						array(
							'id'=>array('label'=>'ID','url'=>'user/service/view/'),
							'service_name()'=>array('label'=>'Details'),
							'recur_schedule'=>array('label'=>'Billing'),
							'price(TRUE,TRUE)'=>array('label'=>'Price','class'=>'right'),
							'active'=>array('label'=>'Active'),
							'account->accnum()'=>array('label'=>'Cust ID'),
							'account->name()'=>array('label'=>'Customer'),
							'date_next_invoice'=>array('label'=>'Next Invoice'),
							'account->invoices_due_total(NULL,TRUE)'=>array('label'=>'Due Invoices'),
						),
						array(
							'page'=>TRUE,
							'type'=>'select',
							'form'=>'user/service/view',
						)),
					));
		}
	}

	private function consoltraffic($svs,$date) {
		$data = array();

		foreach ($svs as $so) {
			$c = array();
			foreach ($so->plugin()->get_traffic_data_monthly($date) as $metric => $ma) {
				foreach ($ma as $month => $traffic) {
					// Only count the service once, not for each metric.
					if (! isset($c[$month])) {
						if (isset($data['svs'][$month]))
							$data['svs'][$month] += 1;
						else
							$data['svs'][$month] = 1;

						$c[$month] = 1;
					}

					if (isset($data['data'][$metric][$month]))
						$data['data'][$metric][$month] += (int)$traffic;
					else
						$data['data'][$metric][$month] = (int)$traffic;
				}
			}
		}

		ksort($data['svs']);
		foreach ($data['data'] as $metric => $details)
			ksort($data['data'][$metric]);

		return $data;
	}

	public function action_listadslservices() {
		$svs = $this->filter(ORM::factory('service')->list_bylistgroup('ADSL'),$this->ao->affiliate->id,'name()');
		$data = $this->consoltraffic($svs,time());

		$google = GoogleChart::factory('vertical_bar');
		$google->title = sprintf('ADSL traffic as at %s',date('Y-m-d',strtotime('yesterday')));
		$google->series(array('title'=>array_keys($data['data']),'axis'=>'x','data'=>$data['data']));
		$google->series(array('title'=>'Services','axis'=>'r','data'=>array('Services'=>$data['svs'])));

		Block::add(array('body'=>$google));

		Block::add(array(
			'title'=>_('ADSL Services'),
			'body'=>Table::display(
				$svs,
				NULL,
				array(
					'id'=>array('label'=>'ID','url'=>'user/service/view/'),
					'name()'=>array('label'=>'Service'),
					'plugin()->ipaddress()'=>array('label'=>'IP Address'),
					'product->plugin()->speed'=>array('label'=>'Speed'),
					'product->plugin()->allowance()'=>array('label'=>'Allowance'),
					'plugin()->traffic_thismonth()'=>array('label'=>'This Month'),
					'plugin()->traffic_lastmonth()'=>array('label'=>'Last Month'),
					'recur_schedule'=>array('label'=>'Billing'),
					'price(TRUE,TRUE)'=>array('label'=>'Price','class'=>'right'),
					'account->accnum()'=>array('label'=>'Cust ID'),
					'account->name()'=>array('label'=>'Customer'),
					'date_next_invoice'=>array('label'=>'Next Invoice'),
				),
				array(
					'type'=>'select',
					'form'=>'user/service/view',
				)),
			));
	}

	public function action_listhspaservices() {
		$svs = $this->filter(ORM::factory('service')->list_bylistgroup('HSPA'),$this->ao->affiliate->id,'name()');
		$data = $this->consoltraffic($svs,time());

		$google = GoogleChart::factory('vertical_bar');
		$google->title = sprintf('HSPA traffic as at %s',date('Y-m-d',strtotime('yesterday')));
		$google->series(array('title'=>array_keys($data['data']),'axis'=>'x','data'=>$data['data']));
		$google->series(array('title'=>'Services','axis'=>'r','data'=>array('Services'=>$data['svs'])));

		Block::add(array('body'=>$google));

		Block::add(array(
			'title'=>_('HSPA Services'),
			'body'=>Table::display(
				$svs,
				NULL,
				array(
					'id'=>array('label'=>'ID','url'=>'user/service/view/'),
					'name()'=>array('label'=>'Service'),
					'plugin()->ipaddress()'=>array('label'=>'IP Address'),
					'product->plugin()->speed'=>array('label'=>'Speed'),
					'product->plugin()->allowance()'=>array('label'=>'Allowance'),
					'plugin()->traffic_thismonth()'=>array('label'=>'This Month'),
					'plugin()->traffic_lastmonth()'=>array('label'=>'Last Month'),
					'recur_schedule'=>array('label'=>'Billing'),
					'price(TRUE,TRUE)'=>array('label'=>'Price','class'=>'right'),
					'account->accnum()'=>array('label'=>'Cust ID'),
					'account->name()'=>array('label'=>'Customer'),
					'date_next_invoice'=>array('label'=>'Next Invoice'),
				),
				array(
					'type'=>'select',
					'form'=>'user/service/view',
				)),
			));
	}

	public function action_listdomainservices() {
		Block::add(array(
			'title'=>_('Domain Names'),
			'body'=>Table::display(
				$this->filter(ORM::factory('service')->list_bylistgroup('DOMAIN'),$this->ao->affiliate->id,'name()'),
				25,
				array(
					'id'=>array('label'=>'ID','url'=>'user/service/view/'),
					'service_name()'=>array('label'=>'Details'),
					'plugin()->display("domain_expire")'=>array('label'=>'Expire'),
					'recur_schedule'=>array('label'=>'Billing'),
					'price(TRUE,TRUE)'=>array('label'=>'Price','class'=>'right'),
					'account->accnum()'=>array('label'=>'Cust ID'),
					'account->name()'=>array('label'=>'Customer'),
					'display("date_next_invoice")'=>array('label'=>'Next Invoice'),
				),
				array(
					'page'=>TRUE,
					'type'=>'select',
					'form'=>'user/service/view',
				)),
			));
	}

	public function action_listhostservices() {
		Block::add(array(
			'title'=>_('Hosting Services'),
			'body'=>Table::display(
				$this->filter(ORM::factory('service')->list_bylistgroup('HOST'),$this->ao->affiliate->id,'name()'),
				25,
				array(
					'id'=>array('label'=>'ID','url'=>'user/service/view/'),
					'service_name()'=>array('label'=>'Details'),
					'plugin()->display("host_expire")'=>array('label'=>'Expire'),
					'recur_schedule'=>array('label'=>'Billing'),
					'price(TRUE,TRUE)'=>array('label'=>'Price','class'=>'right'),
					'account->accnum()'=>array('label'=>'Cust ID'),
					'account->name()'=>array('label'=>'Customer'),
					'display("date_next_invoice")'=>array('label'=>'Next Invoice'),
				),
				array(
					'page'=>TRUE,
					'type'=>'select',
					'form'=>'user/service/view',
				)),
			));
	}
}
?>
