<?php
/*
* 2007-2015 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <contact@prestashop.com>
*  @copyright  2007-2015 PrestaShop SA
*  @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

/**
  * @deprecated 1.5.0.1
  */
class DiscountCore extends CartRule
{
	const PERCENT = 1;
	const AMOUNT = 2;
	const FREE_SHIPPING = 3;
	
	public function __get($key)
	{
		Tools::displayAsDeprecated();
		
		if ($key == 'id_group')
			return 0;
		if ($key == 'id_discount_type')
		{
			if ($this->free_shipping)
				return Discount::FREE_SHIPPING;
			if ($this->reduction_percent > 0)
				return Discount::PERCENT;
			if ($this->reduction_amount > 0)
				return Discount::AMOUNT;
		}
		if ($key == 'name')
			return $this->code;
		if ($key == 'value')
		{
			if ($this->reduction_percent > 0)
				return $this->reduction_percent;
			if ($this->reduction_amount > 0)
				return $this->reduction_amount;
		}
		if ($key == 'cumulable')
			return $this->cart_rule_restriction;
		if ($key == 'cumulable_reduction')
			return false;
		if ($key == 'minimal')
			return $this->minimum_amount;
		if ($key == 'include_tax')
			return $this->reduction_tax;
		if ($key == 'behavior_not_exhausted')
			return $this->partial_use;
		if ($key == 'cart_display')
			return true;

		return $this->{$key};
	}
	
	public function __set($key, $value)
	{
		Tools::displayAsDeprecated();
		
		if ($key == 'id_discount_type')
		{
			if ($value == Discount::FREE_SHIPPING)
			{
				$this->free_shipping = true;
				$this->reduction_percent = false;
				$this->reduction_amount = false;
			}
			if ($value == Discount::PERCENT)
			{
				$this->free_shipping = false;
				$this->reduction_percent = true;
				$this->reduction_amount = false;
			}
			if ($value == Discount::AMOUNT)
			{
				$this->free_shipping = false;
				$this->reduction_percent = false;
				$this->reduction_amount = true;
			}
		}
		
		if ($key == 'code')
			$this->name[Configuration::get('PS_LANG_DEFAULT')] = $value;
		
		if ($key == 'value')
		{
			if ($this->reduction_percent)
				$this->reduction_percent = $value;
			if ($this->reduction_amount)
				$this->reduction_amount = $value;
		}
		if ($key == 'cumulable')
			$this->cart_rule_restriction = 1;
		if ($key == 'minimal')
			$this->minimum_amount = $value;
		if ($key == 'include_tax')
			$this->reduction_tax = $value;
		if ($key == 'behavior_not_exhausted')
			$this->partial_use = $value;
		
		$this->{$key} = $value;
	}
	
	public function __call($method, $args)
	{
		Tools::displayAsDeprecated();
		$obj = $this->parent;
		if (in_array($method, array('add', 'update', 'getIdByName', 'getCustomerDiscounts', 'getValue', 'discountExists', 'createOrderDiscount', 'getVouchersToCartDisplay', 'display')))
			$obj = $this;
		return call_user_func_array(array($obj, $method), $args);
	}

	/**
	  * @deprecated 1.5.0.1
	  */
	public function add($autodate = true, $nullValues = false, $categories = null)
	{
		$r = parent::add($autodate, $nullValues);
		// Todo : manage categories
		return $r;
	}
	
	/**
	  * @deprecated 1.5.0.1
	  */
	public function update($autodate = true, $nullValues = false, $categories = null)
	{
		$r = parent::update($autodate, $nullValues);
		// Todo : manage categories
		return $r;
	}

	/**
	  * @deprecated 1.5.0.1
	  */
	public static function getIdByName($code)
	{
	 	return parent::getIdByCode($code);
	}

	/**
	  * @deprecated 1.5.0.1
	  */
	public static function getCustomerDiscounts($id_lang, $id_customer, $active = false, $includeGenericOnes = true, $hasStock = false, Cart $cart = null)
	{
		return parent::getCustomerCartRules($id_lang, $id_customer, $active, $includeGenericOnes, $hasStock, $cart);
	}
	
	/**
	  * @deprecated 1.5.0.1
	  */
	public static function getVouchersToCartDisplay($id_lang, $id_customer)
	{
		return CartRule::getCustomerCartRules($id_lang, $id_customer);
	}

	/**
	  * @deprecated 1.5.0.1
	  */
	public function getValue($nb_discounts = 0, $order_total_products = 0, $shipping_fees = 0, $id_cart = false, $useTax = true, Currency $currency = null, Shop $shop = null)
	{
		$context = Context::getContext();
		if ((int)$id_cart)
			$context->cart = new Cart($id_cart);
		if (Validate::isLoadedObject($currency))
			$context->currency = $currency;
		if (Validate::isLoadedObject($shop))
			$context->shop = $shop;
	 	return parent::getContextualValue($useTax, $context);
    }

	/**
	  * @deprecated 1.5.0.1
	  */
	public static function discountExists($discountName, $id_discount = 0)
	{
		return parent::cartRuleExists($discountName);
	}

	/**
	  * @deprecated 1.5.0.1
	  */
	public static function createOrderDiscount($order, $productList, $qtyList, $name, $shipping_cost = false, $id_category = 0, $subcategory = 0)
	{		
		$languages = Language::getLanguages($order);
		$products = $order->getProducts(false, $productList, $qtyList);

		// Totals are stored in the order currency (or at least should be)
		$total = $order->getTotalProductsWithTaxes($products);
		$discounts = $order->getDiscounts(true);
		$total_tmp = $total;
		foreach ($discounts as $discount)
		{
			if ($discount['id_discount_type'] == Discount::PERCENT)
				$total -= $total_tmp * ($discount['value'] / 100);
			elseif ($discount['id_discount_type'] == Discount::AMOUNT)
				$total -= ($discount['value'] * ($total_tmp / $order->total_products_wt));
		}
		if ($shipping_cost)
			$total += $order->total_shipping;

		// create discount
		$voucher = new Discount();
		$voucher->id_discount_type = Discount::AMOUNT;
		foreach ($languages as $language)
			$voucher->description[$language['id_lang']] = strval($name).(int)($order->id);
		$voucher->value = (float)($total);
		$voucher->name = 'V0C'.(int)($order->id_customer).'O'.(int)($order->id);
		$voucher->id_customer = (int)($order->id_customer);
		$voucher->id_currency = (int)($order->id_currency);
		$voucher->quantity = 1;
		$voucher->quantity_per_user = 1;
		$voucher->cumulable = 1;
		$voucher->cumulable_reduction = 1;
		$voucher->minimal = (float)($voucher->value);
		$voucher->active = 1;
		$voucher->cart_display = 1;

		$now = time();
		$voucher->date_from = date('Y-m-d H:i:s', $now);
		$voucher->date_to = date('Y-m-d H:i:s', $now + (3600 * 24 * 365.25)); /* 1 year */
		if (!$voucher->validateFieldsLang(false) || !$voucher->add())
			return false;
		// set correct name
		$voucher->name = 'V'.(int)($voucher->id).'C'.(int)($order->id_customer).'O'.$order->id;
		if (!$voucher->update())
			return false;

		return $voucher;
	}

	/**
	  * @deprecated 1.5.0.1
	  */
	public static function display($value, $type, $currency = null)
	{
		if ((float)$value && (int)$type)
		{
			if ($type == 1)
				return $value.chr(37); // ASCII #37 --> % (percent)
			elseif ($type == 2)
				return Tools::displayPrice($value, $currency);
		}
		return ''; // return a string because it's a display method
	}
}