<?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 TicketHandler extends Voucher
{

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

	/**
	 * ticket database result array
	 * @var Array
	 */
	protected $arrTicket = array();

	protected $blnIsVariant = null;

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

		$this->load($strOxId);

		parent::__construct();
	}

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

	public function __set($name, $value)
	{
		if ($this->arrTicket[strtoupper($name)])
		{
			$this->arrTicket[strtoupper($name)] = $value;
		}
	}

	public function getData()
	{
		return $this->arrTicket;
	}

	protected function load($strOxId)
	{
		$objSQL = $this->oxDB->prepare("SELECT a.OXID, a.OXPARENTID, a.OXTITLE, pa.OXTITLE AS 'OXPARENTTITLE', pa.OXSHORTDESC AS 'OXPARENTSHORTDESC', a.OXSHORTDESC, a.OXACTIVE, UNIX_TIMESTAMP(a.OXACTIVEFROM) AS 'OXACTIVEFROM', UNIX_TIMESTAMP(a.OXACTIVETO) AS 'OXACTIVETO', UNIX_TIMESTAMP(a.OXESSELLUNTIL) AS 'OXESSELLUNTIL', a.OXPRICE, a.OXSTOCK, a.OXVARSTOCK, a.OXVARNAME, a.OXVARSELECT FROM oxv_oxarticles_de a LEFT JOIN oxv_oxarticles_de AS pa ON pa.OXID = a.OXPARENTID AND a.OXPARENTID != ''  WHERE a.OXID = ?");

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

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

	protected function refresh()
	{
		$this->load($this->oxid);
	}


	public function isVariant()
	{
		if (is_null($this->blnIsVariant))
		{
			$this->blnIsVariant = (bool) ( $this->oxparentid ? $this->oxparentid : false );
		}

		return $this->blnIsVariant;
	}

	public function isBuyable()
	{
		if ($this->isActiveTime() && $this->oxactive && $this->oxstock > 0)
		{
			return true;
		}
		return false;
	}

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


	public function reduceStock($iVal)
	{
		$iVal = (int) $iVal;
		if ($iVal <= $this->oxstock && $iVal > 0)
		{
			$objSQL = $this->oxDB->prepare("UPDATE oxarticles SET OXSTOCK = OXSTOCK - $iVal WHERE OXID = ?");
			$objSQL->execute($this->oxid);

			if ($this->isVariant())
			{
				$objSQL = $this->oxDB->prepare("UPDATE oxarticles p SET p.OXVARSTOCK = (SELECT SUM(v.OXSTOCK) FROM oxarticles v WHERE OXPARENTID = ?), p.OXSOLDAMOUNT = p.OXSOLDAMOUNT + $iVal WHERE p.OXID = ? AND p.OXPARENTID = ''");
				$objSQL->execute($this->oxparentid,$this->oxparentid);
			} else {
				$objSQL = $this->oxDB->prepare("UPDATE oxarticles SET OXSOLDAMOUNT = OXSOLDAMOUNT + $iVal WHERE OXID = ?");
				$objSQL->execute($this->oxid);
			}

			$this->refresh();
		}
	}
}