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

/**
 * This class provides invoice information
 *
 * @package    Invoice
 * @category   Helpers
 * @author     Deon George
 * @copyright  (c) 2009-2013 Open Source Billing
 * @license    http://dev.osbill.net/license.html
 */
class Invoice {
	// This invoice Object
	private $io;

	public function __construct(Model_Invoice $io=NULL) {
		$this->io = is_null($io) ? ORM::factory('Invoice') : $io;
	}

	public static function instance(Model_Invoice $io=NULL) {
		return new Invoice($io);
	}

	/**
	 * Add a Service to an Invoice
	 *
	 * @param $so Model_Servie
	 */
	public function add_service(Model_Service $so) {
		$pdata = Period::details($so->recur_schedule,$so->product->price_recurr_day,$so->invoiced_to()+86400,FALSE,$so->product->price_recurr_strict);

		$iio = ORM::factory('Invoice_Item');
		$iio->service_id = $so->id;
		$iio->product_id = $so->product_id;
		$iio->quantity = $pdata['prorata'];
		$iio->price_base = $so->price();
		$iio->recurring_schedule = $so->recur_schedule;
		$iio->date_start = $pdata['start_time'];
		$iio->date_stop = $pdata['end_time'];

		// Service Billing
		$iio->item_type = StaticList_ItemType::index('MAIN');

		$this->io->add_item($iio);

		// Check if there are any charges
		$c = ORM::factory('Charge')
			->where('service_id','=',$so->id)
			->where('processed','is',NULL);

		foreach ($c->find_all() as $co) {
			$iio = ORM::factory('Invoice_Item');
			$iio->service_id = $co->service_id;
			$iio->product_id = $co->product_id;
			$iio->charge_id = $co->id;
			$iio->quantity = $co->quantity;
			$iio->price_base = $co->amount;
			$iio->date_start = $co->date_orig;
			$iio->date_stop = $co->date_orig;

			// @todo This should be $co->item_type;
			$iio->item_type = StaticList_ItemType::index('EXCESS');

			$this->io->add_item($iio);
		}

		return $this;
	}

	public function render($type,$section) {
		switch ($type) {
			case 'html':
				switch ($section) {
					case 'body':
						return View::factory('invoice/user/view/body')
							->set('o',$this->io);
						break;

					default:
						throw HTTP_Exception::factory(501,'Unknown section type :section',array(':section'=>$section));
				}

				break;

			default:
				throw HTTP_Exception::factory(501,'Unknown render type :type',array(':type'=>$type));
		}
	}

	/**
	 * Generate a PDF invoice
	 */
	public function pdf() {
		$invoice_class = Kohana::classname('Invoice_TCPDF_'.Kohana::$config->load('invoice')->driver);

		$pdf = new $invoice_class($this->io);

		if ($pdf->getTemplate()) {
			$pagecount = $pdf->setSourceFile($pdf->getTemplate());
			$tplidx = $pdf->ImportPage(1);
		}

		$pdf->addPage();

		# If we are using FPDI
		if (isset($tplidx))
			$pdf->useTemplate($tplidx);

		$this->draw_summary_invoice($pdf);

		# If we get here, all is OK.
		return $pdf;
	}

	private function draw_summary_invoice($pdf) {
		// Draw Invoice Basics
		$pdf->drawCompanyLogo();
		$pdf->drawCompanyAddress();
		$pdf->drawInvoiceHeader();
		// @todo Get news from DB
		$pdf->drawNews('');
		$pdf->drawRemittenceStub();
		$pdf->drawPaymentMethods();

		if ($this->io->billing_status !=1 && $this->io->due_date <= time())
			$pdf->drawInvoiceDueNotice();
		elseif($this->io->billing_status == 1)
			$pdf->drawInvoicePaidNotice();

		if ($this->io->account->invoices_due_total())
			$pdf->drawSummaryInvoicesDue();

		$pdf->drawSummaryLineItems();

		// Next Page
		$pdf->drawDetailLineItems();

		// Draw any Custom functions:
		$pdf->drawCustom();
	}
}
?>