<?php

namespace Lc\ShopBundle\Services\Price;

use Doctrine\Common\Collections\Collection;
use Lc\ShopBundle\Context\OrderProductInterface;
use Lc\ShopBundle\Context\OrderShopInterface;
use Lc\ShopBundle\Context\ProductFamilyInterface;
use Lc\ShopBundle\Context\ProductInterface;
use Lc\ShopBundle\Context\ProductPropertyInterface;
use Lc\ShopBundle\Context\ReductionCatalogInterface;

class ProductPriceUtils
{
        use PriceUtilsTrait ;

        public function getPrice(ProductPropertyInterface $product)
        {
                if ($product->getBehaviorPriceInherited() == 'by-piece') {
                        return $product->getPriceInherited();
                }
                elseif ($product->getBehaviorPriceInherited() == 'by-reference-unit') {
                        if ($product->getQuantityInherited() > 0) {
                                return $product->getPriceByRefUnitInherited() * ($product->getQuantityInherited() / $product->getUnitInherited()->getCoefficient());
                        }else{
                                return 0;
                        }
                }
        }

        public function getPriceWithTax(ProductPropertyInterface $product)
        {
                return $this->applyTax(
                        $this->getPrice($product),
                        $product->getTaxRateInherited()->getValue()
                );
        }


        public function getPriceByRefUnit(ProductPropertyInterface $product)
        {
                if ($product->getBehaviorPriceInherited() == 'by-piece') {
                        return ($this->getPrice($product) * $product->getUnitInherited()->getCoefficient()) / $product->getQuantityInherited();
                } elseif ($product->getBehaviorPriceInherited() == 'by-reference-unit') {
                        return $product->getPriceByRefUnitInherited();
                }
        }

        public function getPriceByRefUnitWithTax(ProductPropertyInterface $product)
        {
                return $this->applyTax(
                        $this->getPriceByRefUnit($product),
                        $product->getTaxRateInherited()->getValue()
                );
        }


        public function getPriceWithTaxAndReduction(ProductPropertyInterface $product)
        {
                return $this->applyReductionCatalog(
                        $product,
                        $this->getPrice($product),
                        $this->getPriceWithTax($product)
                );
        }

        public function getPriceByRefUnitWithTaxAndReduction(ProductPropertyInterface $product)
        {

                return $this->applyReductionCatalog(
                        $product,
                        $this->getPriceByRefUnit($product),
                        $this->getPriceByRefUnitWithTax($product)
                );

        }


        public function getBuyingPrice(ProductPropertyInterface $product)
        {
                if ($product->getBehaviorPriceInherited() == 'by-piece') {
                        return $product->getBuyingPriceInherited();
                }
                elseif ($product->getBehaviorPriceInherited() == 'by-reference-unit') {

                        if ($product->getQuantityInherited() > 0) {
                                return $product->getBuyingPriceByRefUnitInherited() * ($product->getQuantityInherited() / $product->getUnitInherited()->getCoefficient());
                        }else{
                                return 0;
                        }
                }
        }

        public function getMultiplyingFactor(ProductPropertyInterface $product){
                return $this->round($this->getPriceWithTax($product) / $this->getBuyingPrice($product));
        }

}

