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

/**
 * This class provides invoice information
 *
 * @package    OSB
 * @subpackage Invoice
 * @category   Helpers
 * @author     Deon George
 * @copyright  (c) 2010 Deon George
 * @license    http://dev.leenooks.net/license.html
 */
class Invoice {
	// This invoice Object
	private $io;

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

	/**
	 * 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($io) {
		$invoice_class = sprintf('invoice_pdf_%s',Kohana::config('invoice.driver'));

		if (! class_exists($invoice_class))
			throw new Kohana_Exception('Invoice class :class doesnt exist',array(':class'=>$invoice_class));

		$this->io = $io;
		$pdf = new $invoice_class($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->suspend_billing != 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();
return;
        #unset($pdf->itemsSummary);

        # BEGIN loop for enumerating information in multiple ways on the invoice
        $iteration = 0;
        while ($pdf->drawLineItems_pre($iteration)) {
            foreach ($this->sInvoiceItems() as $index => $items) {
                # Get the date range if set
                if (! empty($items['date_start']) && ! empty($items['date_stop'])) {
                    global $C_translate;
                    $C_translate->value('invoice','start',date(UNIX_DATE_FORMAT,$items['date_start']));
                    $C_translate->value('invoice','stop',date(UNIX_DATE_FORMAT,$items['date_stop']));
				}

                $line = array(
                    'name'=>$this->sLineItemDesc($index),
                    'domain'=>$items['domain_name'],
                    'amount'=>$items['price_base'],
                    'sku'=>$items['sku'],
                    'qty'=>$items['quantity'],
                    'cost'=>$items['price_base'],
                    'attr'=>$items['product_attr'],
                    'price_type'=>$items['price_type'],
                    'price_base'=>$items['price_base'],
                    'item_type'=>$items['item_type'],
                    'total_amt'=>$items['total_amt']
                );

                if ($items['date_start'] && $items['date_stop'])
                    if ($items['date_start'] == $items['date_stop'])
                        $line['daterange'] = sprintf('%s',date(UNIX_DATE_FORMAT,$items['date_start']));
                    else
                        $line['daterange'] = sprintf('%s - %s',date(UNIX_DATE_FORMAT,$items['date_start']),date(UNIX_DATE_FORMAT,$items['date_stop']));

                $pdf->drawLineItems($db,$line,$this->getRecordAttr('id'));

                if ($items['price_setup']) {
                    $line = array(
                        'name'=>sprintf('%s - %s',$this->sLineItemDesc($index),_('Setup Charge')),
                        'amount'=>$items['price_setup'],
                        'qty'=>'1',
                        'sku'=>$items['sku'],
                        'cost'=>$items['price_setup'],
                        'price_base'=>$items['price_setup'],
                        'price_type'=>999
                    );

                    $pdf->drawLineItems($db,$line,$this->getRecordAttr('id'));
                }
            }

            if ($this->print['invoice']['discount_amt']) {
                $line = array(
                    'name'=>_('Discount'),
                    'amount'=>-($this->print['invoice']['discount_amt']),
                    'qty'=>'1',
                    'cost'=>-($this->print['invoice']['discount_amt']),
                    'price_base'=>-($this->print['invoice']['discount_amt']),
                    'price_type'=>999);

                $pdf->drawLineItems($db,$line,$this->getRecordAttr('id'));
            }

            if ($this->print['invoice']['tax_amt']) {
                $rs = $db->Execute(sqlSelect($db,array('invoice_item_tax','tax'),'A.amount,B.description',sprintf('A.tax_id=B.id AND A.invoice_id=%s',$this->getRecordAttr('id'))));
                if ($rs && $rs->RecordCount()) {
                    $taxes = array();

                    while (! $rs->EOF) {
                        if (! isset($taxes[$rs->fields['description']]))
                            $taxes[$rs->fields['description']] = $rs->fields['amount'];
                        else
                            $taxes[$rs->fields['description']] += $rs->fields['amount'];

                        $rs->MoveNext();
                    }

                    foreach ($taxes as $txds => $txamt) {
                        $line = array('name'=>$txds,'amount'=>$txamt,'total_amt'=>$txamt,'price_type'=>999);
                        $pdf->drawLineItems($db,$line,$this->getRecordAttr('id'));
                    }
                }
            }

            # Increment the iteration
            ++$iteration;
        }

        # Custom functions:
        $pdf->drawCustom();
	}
}
?>