<?php

namespace Lc\ShopBundle\Model;

use App\Entity\OrderProductReductionCatalog;
use Doctrine\ORM\Mapping as ORM;
use Lc\ShopBundle\Context\PriceInterface;

/**
 * @ORM\MappedSuperclass()
 */
abstract class OrderProduct implements PriceInterface
{
        use PriceTrait ;

        /**
         * @ORM\ManyToOne(targetEntity="Lc\ShopBundle\Context\OrderShopInterface", inversedBy="orderProducts", cascade={"persist"})
         * @ORM\JoinColumn(nullable=false)
         */
        protected $orderShop;

        /**
         * @ORM\ManyToOne(targetEntity="Lc\ShopBundle\Context\ProductInterface", inversedBy="orderProducts"))
         */
        protected $product;

        /**
         * @ORM\Column(type="integer")
         */
        protected $quantityOrder;

        /**
         * @ORM\Column(type="float")
         */
        protected $quantityProduct;

        /**
         * @ORM\Column(type="string", length=255)
         */
        protected $title;

        /**
         * @ORM\OneToOne(targetEntity="Lc\ShopBundle\Context\OrderProductReductionCatalogInterface", cascade={"persist", "remove"})
         */
        protected $orderProductReductionCatalog;

        public function __toString()
        {
                if($this->getTitle()) {
                        return $this->getTitle();
                }
                else{
                        return $this->getProduct()->getProductFamily()->getTitle(). ' - '.$this->getProduct()->getTitle();
                }
        }

        public function getTitleOrderShop()
        {
                $product = $this->getProduct() ;
                $productFamily = $product->getProductFamily() ;

                $titleProduct = $product->getTitle() ;
                $titleProductFamily = $productFamily->getTitle() ;

                if(strlen($titleProduct) > 0 && strlen($titleProductFamily) > 0) {
                        $title = $titleProductFamily.' - '.$titleProduct ;
                }
                else {
                        $title = strlen($titleProduct) ? $titleProduct : $titleProductFamily ;
                }

                if($productFamily->hasProductsWithVariousWeight()) {
                        $title .= ' - '.$product->getQuantityLabelInherited() ;
                }

                return $title ;
        }

        public function getTitleSummaryAfterAddCart()
        {
                $title = '' ;

                $product = $this->getProduct() ;
                $productFamily = $product->getProductFamily() ;
                $titleProduct = $product->getTitleInherited() ;
                $titleProductFamily = $productFamily->getTitle() ;

                // multiple
                if($productFamily->getActiveProducts() && $productFamily->getBehaviorAddToCart() == 'multiple') {
                        $title .= $titleProduct ;
                        if($productFamily->hasProductsWithVariousWeight()) {
                                $title .= ' - '.$product->getQuantityLabelInherited() ;
                        }
                }

                // simple
                if($productFamily->getBehaviorAddToCart() == 'simple') {
                        if($productFamily->getActiveProducts()) {
                                $title .= $titleProduct ;
                                if($productFamily->hasProductsWithVariousWeight()) {
                                        $title .= ' - '.$product->getQuantityLabelInherited() ;
                                }
                        }
                }

                return $title ;
        }

        public function getOrderShop(): ?OrderShop
        {
                return $this->orderShop;
        }

        public function setOrderShop(?OrderShop $orderShop): self
        {
                $this->orderShop = $orderShop;

                return $this;
        }

        public function getProduct(): ?Product
        {
                return $this->product;
        }

        public function setProduct(?Product $product): self
        {
                $this->product = $product;

                return $this;
        }

        public function getQuantityOrder(): ?int
        {
                return $this->quantityOrder;
        }

        public function setQuantityOrder(int $quantityOrder): self
        {
                $this->quantityOrder = $quantityOrder;

                return $this;
        }

        public function getQuantityProduct(): ?float
        {
                return $this->quantityProduct;
        }

        public function setQuantityProduct(float $quantityProduct): self
        {
                $this->quantityProduct = $quantityProduct;

                return $this;
        }

        public function getTitle(): ?string
        {
                return $this->title;
        }

        public function setTitle(string $title): self
        {
                $this->title = $title;

                return $this;
        }

        public function getOrderProductReductionCatalog(): ?OrderProductReductionCatalog
        {
                return $this->orderProductReductionCatalog;
        }

        public function setOrderProductReductionCatalog(?OrderProductReductionCatalog $orderProductReductionCatalog): self
        {
                $this->orderProductReductionCatalog = $orderProductReductionCatalog;

                return $this;
        }

}