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

/**
 * This class provides payment capabilities.
 *
 * @package    Payment
 * @category   Controllers/Admin
 * @author     Deon George
 * @copyright  (c) 2009-2013 Open Source Billing
 * @license    http://dev.osbill.net/license.html
 */
class Controller_Admin_Payment extends Controller_Payment {
	protected $secure_actions = array(
		'add'=>TRUE,
		'addbulk'=>TRUE,
		'ajaxitemlist'=>TRUE,
		'ajaxlist'=>TRUE,
		'edit'=>TRUE,
	);

	public function action_add() {
		Block::factory()
			->type('form-horizontal')
			->title('Add/View Payment')
			->title_icon('icon-wrench')
			->body($this->add_edit());
	}

	public function action_addbulk() {
		$output = '';

		if ($this->request->post() AND $this->request->post('payer')) {
			$c = Kohana::classname('Payment_Bulk_'.$this->request->post('payer'));
			$o = new $c();

			$output .= (! $_FILES) ? $o->form() : $o->process();

		// We dont know what sort of payment type yet
		} else {
			$output .= Form::open();
			$output .= Form::select('payer',$this->templates());
			$output .= Form::button('submit','Submit',array('class'=>'btn btn-primary'));
			$output .= Form::close();
		}

		Block::factory()
			->title('Bulk Payments Received')
			->title_icon('icon-share')
			->body($output);
	}

	/**
	 * Return rendered invoices paid by this payment, and outstanding invoices
	 */
	public function action_ajaxitemlist() {
		$invoices = array();

		// Get our invoices paid by this payment ID
		$po = ORM::factory('Payment',$this->request->query('pid'));

		// Get all our other outstanding invoices
		foreach (ORM::factory('Account',$this->request->query('key'))->invoices_due() as $io) {
			$pio = $po->payment_item;
			$pio->invoice_id = $io->id;

			$po->add_item($pio);
		}

		$this->response->body(View::factory('payment/admin/ajaxitemlist')
			->set('o',$po));
	}

	public function action_ajaxlist() {
		$result = array();

		if ($this->request->query('term'))
			$result = Arr::merge($result,ORM::factory('Account')->list_autocomplete($this->request->query('term'),'id','id',array('ACC %s: %s'=>array('id','name()'))));
			$result = Arr::merge($result,ORM::factory('Invoice')->list_autocomplete($this->request->query('term'),'id','account_id',array('INV %s: %s'=>array('id','account->name()'))));
		}

		$this->response->headers('Content-Type','application/json');
		$this->response->body(json_encode(array_values($result)));
	}

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

		Block::factory()
			->type('form-horizontal')
			->title(sprintf('%s: %s',_('View Payments Received'),$id))
			->title_icon('icon-wrench')
			->body($this->add_edit($id,$output));
	}

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

		if ($this->request->post()) {
			$po->values($this->request->post());

			// Update our invoice payment items
			if (is_array($this->request->post('payment_item')) AND count($this->request->post('payment_item')))
				foreach ($this->request->post('payment_item') as $k=>$v) {
					$pio = $po->payment_item;
					$pio->invoice_id = $k;
					$pio = $po->add_item($pio);

					$pio->alloc_amt = is_numeric($v) ? $v : 0;
				}

			$this->save($po);
		}

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

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

		Script::factory()
			->type('stdin')
			->data('
$(document).ready(function() {
	$("#date_payment_label").datepicker({
		autoclose : true,
		todayHighlight: true,
		endDate : new Date(),
		format : "dd-mm-yyyy",
		todayBtn : true,
	}).on("hide",function(ev) {
		$("input[name=date_payment]").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]);

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

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

		if ($po->loaded())
			Script::factory()
				->type('stdin')
				->data('
$(document).ready(function() {
	$("div[id=items]").load("'.URL::link('admin','payment/ajaxitemlist',TRUE).'", {key: "'.$po->account_id.'", pid: "'.$po->id.'" });
});
				');

		return View::factory('payment/admin/add_edit')
			->set('o',$po);
	}

	/**
	 * List our availale Buik Payment Methods
	 */
	private function templates() {
		$template_path = 'classes/Payment/Bulk';
		$result = array();

		foreach (Kohana::list_files($template_path) as $file => $path) {
			$file = strtoupper(preg_replace('/.php$/','',str_replace($template_path.'/','',$file)));
			$result[$file] = $file;
		}

		return $result;
	}
}
?>