<?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($io) {
		$this->io = $io;
	}

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

	/**
	 * Return a list of invoices for an service
	 *
	 * @param $id int Service ID
	 * @param $paid boolean Optionally only list the ones that are not paid.
	 * @return array
	 */
	// @todo Function Not Used
	public static function servicelist($id,$paid=TRUE) {
		// @todo need to add the db prefix
		$invoices = DB::Query(Database::SELECT,'
SELECT i.id AS iid,i.due_date AS due FROM ab_invoice i,ab_invoice_item ii WHERE ii.invoice_id=i.id AND service_id=:id GROUP BY i.id
			')
			->param(':id',$id)
			->execute();

		$service_invoices = array();
		foreach ($invoices as $item) {
			if ($bal = Invoice::balance($item['iid']) OR $paid) {
				$service_invoices[$item['iid']]['id'] = $item['iid'];
				$service_invoices[$item['iid']]['total'] = $bal;
				$service_invoices[$item['iid']]['due'] = $item['due'];
			}
		}

		return $service_invoices;
	}

	/**
	 * Return the total of amount outstanding for a service
	 *
	 * @param $id int Service ID
	 * @param $paid boolean Optionally only list the ones that are not paid.
	 * @return real Total amount outstanding
	 * @see Invoice::listservice()
	 */
	// @todo Function Not Used
	public static function servicetotal($id,$paid=TRUE) {
		$total = 0;

		foreach (Invoice::servicelist($id,$paid) as $item)
			$total += $item['total'];

		return $total;
	}

	/**
	 * Return the earliest due date of an outstanding invoice
	 *
	 * @param $id int Service ID
	 * @return datetime
	 */
	// @todo Function Not Used
	public static function servicedue($id) {
		$due = 0;

		foreach (Invoice::servicelist($id,FALSE) as $item)
			if ($due < $item['due'])
				$due = $item['due'];

		return $due;
	}

	// @todo Function Not Used
	public static function balance($id) {
		return ORM::factory('Invoice',$id)->due();
	}

	/**
	 * 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();
	}
}
?>