<?php

/**
 * eSales Media oxVoucher for Contao Open Source CMS
 *
 * Copyright (c) 2015 eSales Media
 *
 * @author  Benjamin Roth [benjamin@esales-media.de]
 * @license proprietary
 */

namespace eSM_oxVoucher;

class VoucherHandler extends Voucher
{

	/**
	 * Oxid Database Object
	 * @var \Database|null
	 */
	protected $oxDB = null;

	/**
	 * voucher database result array
	 * @var Array
	 */
	protected $arrVoucher = array();

	/**
	 * Import Oxid database instance
	 */
	public function __construct($strOxId)
	{
		$this->oxDB = Voucher::getOxDbInstance();

		$objSQL = $this->oxDB->prepare("SELECT vs.oxid as 'OXSERIEID', vs.OXSERIENR, vs.OXSERIEDESCRIPTION, vs.OXDISCOUNT AS 'OXSERIEDISCOUNT', UNIX_TIMESTAMP(vs.OXBEGINDATE) as 'OXBEGINDATE', UNIX_TIMESTAMP(vs.OXENDDATE) as 'OXENDDATE', v.OXID, UNIX_TIMESTAMP(v.OXDATEUSED) as 'OXDATEUSED', v.OXORDERID, v.OXUSERID, v.OXVOUCHERNR, v.OXDISCOUNT FROM oxvouchers as v, oxvoucherseries as vs WHERE vs.OXID = v.OXVOUCHERSERIEID AND v.OXID = ?");

		$objResult = $objSQL->execute($strOxId);

		if ($objResult->numRows)
		{
			$this->arrVoucher = $objResult->row();
		}

		parent::__construct();
	}

	function __get($name)
	{
		if ($this->arrVoucher[strtoupper($name)])
		{
			return $this->arrVoucher[strtoupper($name)];
		}
		return null;
	}


	public function isValid()
	{
		if ((is_null($this->oxorderid) || $this->oxorderid == '') && (is_null($this->oxdateused)) AND $this->getRemainingVal() > 0 && $this->isValidTime())
		{
			return true;
		}
		return false;
	}

	public function isValidTime()
	{
		$Today = new \Date();
		if ((is_null($this->oxbegindate) || $this->oxbegindate <= $Today->tstamp) && (is_null($this->oxenddate) || $this->oxenddate >= $Today->tstamp))
		{
			return true;
		}
		return false;
	}


	public function getUsedVal()
	{
		// Voucher remaining value
		$objSQL = $this->oxDB->prepare("SELECT SUM(OXDISCOUNT) as 'USEDDISCOUNT' FROM oxvouchers_usage WHERE OXDATEUSED > 0 AND OXVOUCHERID = ?");
		$objResult = $objSQL->execute($this->oxid);

		if ($objResult->numRows < 1)
		{
			$fUsedVal = 0.00;
		} else {
			$fUsedVal = floatval($objResult->USEDDISCOUNT);
		}

		return $fUsedVal;
	}

	public function getRemainingVal()
	{
		return $this->oxseriediscount - $this->getUsedVal();
	}

	public function deductValue($fVal)
	{
		$fRemainingVal = $this->getRemainingVal();
		if ($fVal > $fRemainingVal)
		{
			$fVal = $fRemainingVal;
		}

		$arrData = array
		(
			'OXVOUCHERID'   => \Input::post('OXID'),
			'OXDATEUSED'    => date('Y-m-d'),
			'OXORDERID'     => '_BARVERKAUF_',
			'OXDISCOUNT'    => $fVal,
		);
		$objSQL = $this->oxDB->prepare("INSERT INTO oxvouchers_usage %s");
		$objSQL->set($arrData)->execute();

		if ($fVal == $fRemainingVal)
		{
			$arrData = array
			(
				'OXDATEUSED'    => date('Y-m-d'),
				'OXORDERID'     => '_BARVERKAUF_',
				'OXDISCOUNT'    => $this->oxseriediscount,
			);
			$objSQL = $this->oxDB->prepare("UPDATE oxvouchers %s WHERE OXID = ?");
			$objSQL->set($arrData)->execute($this->oxid);
		}
	}
}