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

/**
 * This class provides Admin Service functions
 *
 * @package    Service
 * @category   Controllers/Admin
 * @author     Deon George
 * @copyright  (c) 2009-2013 Open Source Billing
 * @license    http://dev.osbill.net/license.html
 */
class Controller_Admin_Service extends Controller_Service {
	protected $secure_actions = array(
		'add'=>TRUE,
		'ajaxaddplugin'=>TRUE,
		'edit'=>TRUE,
		'listdomainservicesbydnshost'=>TRUE,
		'listhostservicesbysupplier'=>TRUE,
		'view'=>TRUE,
	);

	public function action_add() {
		if ($this->request->post() AND $so=$this->add_edit() AND $so->loaded())
			HTTP::redirect(URL::link('admin','service/edit/'.$so->id));

		// @todo This AJAX URL should be a service one
		Script::factory()
			->type('stdin')
			->data('
$(document).ready(function() {
	$("select[name=product_id]").change(function() {
		// If we select a blank, then dont continue
		if (this.value == 0)
			return false;

		// Send the request and update sub category dropdown
		$.ajax({
			type: "GET",
			data: "key="+$(this).val(),
			dataType: "html",
			cache: false,
			url: "'.URL::link('admin','service/ajaxaddplugin/',TRUE).'",
			timeout: 2000,
			error: function(x) {
				alert("Failed to submit");
			},
			success: function(data) {
				$("div[id=plugin]").empty().append(data);
			}
		});
	});

	$("#date_next_invoice_label").datepicker({
		autoclose : true,
		format : "dd-M-yyyy",
		todayBtn : true,
	}).on("hide",function(ev) {
		$("input[name=date_next_invoice]").val(ev.date.valueOf()/1000);
	});

	$("input[name=account_id_label]").typeahead({
		minLength: 2,
		source: function (query,process) {
			search("'.URL::link('admin','payment/ajaxlist').'",query,process);
		},

		matcher: function () { return true; },

		updater: function (item) {
			$("input[name=account_id]").val(users[item]);

			return item;
		},
	});
});
			');

		Script::factory()
			->type('file')
			->data('media/theme/bootstrap/vendor/datepicker/js/bootstrap-datepicker.js');

		Style::factory()
			->type('file')
			->data('media/theme/bootstrap/vendor/datepicker/css/datepicker.css');

		Block::factory()
			->type('form-horizontal')
			->title('Add/View Charge')
			->title_icon('icon-wrench')
			->body(View::factory('service/admin/add'));
	}

	public function action_ajaxaddplugin() {
		$po = ORM::factory('Product',$this->request->query('key'));

		if (! $po->loaded()) {
			$output = __('Unable to find product :key',array(':key'=>$this->request->query('key')));

		} else {
			$output = $po->plugin()->render_order();
		}

		$this->template->content = $output;
	}

	public function action_edit() {
		list($id,$output) = Table::page(__METHOD__);

		$so = $this->request->post() ? $this->add_edit($id) : ORM::factory('Service',$id);

		if (! $so->loaded())
			HTTP::redirect('welcome/index');

		Script::factory()
			->type('file')
			->data('media/theme/bootstrap/vendor/datepicker/js/bootstrap-datepicker.js');

		Style::factory()
			->type('file')
			->data('media/theme/bootstrap/vendor/datepicker/css/datepicker.css');

		Script::factory()
			->type('stdin')
			->data('
$(document).ready(function() {
	$("#date_next_invoice_label").datepicker({
		autoclose : true,
		format : "dd-M-yyyy",
		todayBtn : true,
	}).on("hide",function(ev) {
		$("input[name=date_next_invoice]").val(ev.date.valueOf()/1000);
	});

	$("#service_connect_date_label").datepicker({
		autoclose : true,
		format : "dd-M-yyyy",
		todayBtn : true,
	}).on("hide",function(ev) {
		$("input[id=service_connect_date]").val(ev.date.valueOf()/1000);
	});

	$("#service_contract_date_label").datepicker({
		autoclose : true,
		format : "dd-M-yyyy",
		todayBtn : true,
	}).on("hide",function(ev) {
		$("input[id=service_contract_date]").val(ev.date.valueOf()/1000);
	});
});
			');

		Block::factory()
			->type('form-horizontal')
			->title(sprintf('%s: %s %s',_('Update Service'),$id,$so->name()))
			->title_icon('icon-wrench')
			->body(View::factory('service/admin/edit')
				->set('o',$so)
				->set('plugin_form',$so->plugin_edit())
			);

	}

	public function action_listdomainservicesbydnshost() {
		$svs = ORM::factory('Service')->list_bylistgroup('DOMAIN');
		Sort::MAsort($svs,'plugin()->host,name()');

		$list = array();

		foreach ($svs as $so)
			$list[$so->plugin()->host->host_server_id][] = $so;

		foreach (array_keys($list) as $sid)
			Block::add(array(
				'title'=>sprintf(_('Domain Names by DNS Host [%s]'),$sid),
				'body'=>Table::display(
					$list[$sid],
					25,
					array(
						'id'=>array('label'=>'ID','url'=>URL::link('user','service/view/')),
						'service_name()'=>array('label'=>'Details'),
						'plugin()->registrar->id'=>array('label'=>'SID'),
						'plugin()->registrar->name'=>array('label'=>'Supplier'),
						'display("date_next_invoice")'=>array('label'=>'Next Invoice'),
					),
					array(
						'page'=>TRUE,
						'type'=>'select',
						'form'=>URL::link('user','service/view'),
					)),
				));
	}

	public function action_listhostservicesbysupplier() {
		$svs = ORM::factory('Service')->list_bylistgroup('HOST');
		Sort::MAsort($svs,'plugin()->host,name()');

		$list = array();

		foreach ($svs as $so)
			$list[$so->plugin()->host_server_id][] = $so;

		foreach (array_keys($list) as $sid)
			Block::add(array(
				'title'=>sprintf(_('Hosting by Supplier %s'),$sid),
				'body'=>Table::display(
					$list[$sid],
					25,
					array(
						'id'=>array('label'=>'ID','url'=>URL::link('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'=>URL::link('user','service/view'),
					)),
				));
	}

	public function action_view() {
		list($id,$output) = Table::page(__METHOD__);

		$so = ORM::factory('Service',$id);

		if (! $so->loaded() OR ! Auth::instance()->authorised($so->account))
			throw HTTP_Exception::factory(403,'Service either doesnt exist, or you are not authorised to see it');

		$doutput = $loutput = '';

		$loutput .= View::factory('service/admin/view')
			->set('o',$so);

		// Validate the transactions
		$bt = NULL;
		$pr = TRUE; // Next entry is a pro-rata
		foreach ($so->transactions()->where('item_type','=',0)->find_all() as $iio) {
			// @todo This hard coding of 3070 should be removed.
//			$xsid=197;
//			if (($iio->service_id == $xsid AND $iio->invoice_id < 3070) OR in_array($iio->id,array(960))) continue;

			if (! $iio->invoice->status OR $iio->void)
				continue;

			if ($iio->quantity < 0 OR $iio->price_base < 0) {
				$bt = $iio->date_start;
				$pr = TRUE;

				continue;
			}

			if (is_null($bt))
				$bt = $iio->date_start;

			$a = ($iio->invoice_id > 4000 OR $iio->product->prod_plugin_file == 'ADSL') ? FALSE : TRUE;

			$pdata = Period::details($iio->recurring_schedule,$a ? NULL : $iio->product->price_recurr_weekday,$bt,TRUE,$iio->product->price_recurr_strict);

			switch ($iio->recurring_schedule) {
				case 1:
				case 2:
				case 4:
				case 5:
					if ($iio->date_start != $pdata['start_time']) {
						$doutput .= sprintf('%s: Set start_time: %s [%s]<br/>',$iio->id,Config::date($pdata['start_time']),$pdata['start_time']);
						$iio->date_start=$pdata['start_time'];
					}

					if (! $pr AND $iio->date_stop != $pdata['end_time']) {
						$doutput .= sprintf('%s: Set end_time: %s [%s] <br/>',$iio->id,Config::date($pdata['end_time']),$pdata['end_time']);
						$iio->date_stop = $pdata['end_time'];
					}

					$bt = ($pr ? $iio->date_stop : $pdata['end_time'])+86400;

					// $doutput .= sprintf('%s: BT now: %s (%s) [%s]<br/>',$iio->id,Config::date($bt),Config::date($pdata['end_time']),$bt);
					break;

				default:
					$doutput .= sprintf('%s: %s Not handled',$iio->id,$iio->recurring_schedule);
			}

			$pr = FALSE;

			//$doutput .= '<br/>';
			if (($x=$this->request->query('go')) AND $x==1)
				$iio->save();
		}

		if (isset($_REQUEST['go']))
			HTTP::redirect(URL::link('admin','service/view/'.$so->id));

		Block::add(array(
			'title'=>sprintf('Transaction History for %s: %s',$so->id(),$so->name()),
			'body'=>$loutput,
		));

		Block::add(array(
			'title'=>sprintf('Transaction Debug for %s: %s',$so->id(),$so->name()),
			'body'=>$doutput,
		));

		$output .= View::factory('service/user/view')
			->set('o',$so);

		Block::add(array(
			'title'=>sprintf('%s: %s',$so->id(),$so->service_name()),
			'body'=>$output,
			));
	}

	private function add_edit($id=NULL,$output='') {
		$so = ORM::factory('Service',$id);

		if ($_POST) {
			if ($so->values($this->request->post())->changed() AND ! ($this->save($so)))
				$so->reload();

			// Do we have plugin data to save as well
			if ($this->request->post('plugin') AND $so->loaded()) {
				$x = $so->plugin();

				if ($x->values(Arr::merge(array('service_id'=>$so->id),$this->request->post('plugin')))->changed())
					$this->save($x);
			}
		}

		return $so;
	}
}
?>
