<?php

namespace Lc\ShopBundle\Services\Order;

use Lc\ShopBundle\Context\OrderReductionCartInterface;
use Lc\ShopBundle\Context\OrderReductionCreditInterface;
use Lc\ShopBundle\Context\OrderShopInterface;
use Lc\ShopBundle\Context\ReductionCartInterface;
use Lc\ShopBundle\Context\ReductionCreditInterface;

trait OrderUtilsReductionTrait
{
        public function compareOrderProductReductionCatalog($orderProductReductionCatalog1, $orderProductReductionCatalog2)
        {
                return (!$orderProductReductionCatalog1 && !$orderProductReductionCatalog2)
                        || ($orderProductReductionCatalog1
                                && $orderProductReductionCatalog2
                                && $orderProductReductionCatalog1->getUnit() == $orderProductReductionCatalog2->getUnit()
                                && (string)$orderProductReductionCatalog1->getValue() == (string)$orderProductReductionCatalog2->getValue()
                                && $orderProductReductionCatalog1->getBehaviorTaxRate() == $orderProductReductionCatalog2->getBehaviorTaxRate());
        }


        public function getSummaryOrderProductReductionCatalog($orderProductReductionCatalog)
        {
                $text = '';

                if ($orderProductReductionCatalog) {
                        if ($orderProductReductionCatalog->getUnit() == 'amount') {
                                $text .= '- ' . $orderProductReductionCatalog->getValue() . '&nbsp;€';
                        }

                        if ($orderProductReductionCatalog->getUnit() == 'percent') {
                                $text .= '- ' . $orderProductReductionCatalog->getValue() . '&nbsp;%';
                        }
                }

                return $text;
        }


        public function createOrderReductionCart(OrderShopInterface $orderShop, ReductionCartInterface $reductionCart)
        {
                $orderReductionCartClass = $this->em->getClassMetadata(OrderReductionCartInterface::class);
                $orderReductionCart = new $orderReductionCartClass->name;

                $orderReductionCart->setOrderShop($orderShop);
                $orderReductionCart->setReductionCart($reductionCart);

                $orderReductionCart->setTitle($reductionCart->getTitle());
                $orderReductionCart->setValue($reductionCart->getValue());
                $orderReductionCart->setUnit($reductionCart->getUnit());
                $orderReductionCart->setBehaviorTaxRate($reductionCart->getBehaviorTaxRate());
                $orderReductionCart->setFreeShipping($reductionCart->getFreeShipping());
                $orderReductionCart->setAppliedTo($reductionCart->getAppliedTo());
                $orderReductionCart->setType($reductionCart->getType());

                $orderShop->addOrderReductionCart($orderReductionCart) ;

                if($this->isOrderShopPositiveAmount($orderShop)) {
                        $this->em->persist($orderReductionCart);
                        $this->em->flush();
                        return $orderReductionCart ;
                }

                return false;
        }

        public function isReductionCreditAllowAddToOrder($orderShop, $reductionCredit)
        {
                $user = $orderShop->getUser() ;

                // appartient à l'utilisateur
                if(!$reductionCredit->getUsers()->contains($user)) {
                        $this->utils->addFlash('error', 'error.reductionCredit.userNotAllow');
                        return false ;
                }

                // n'a pas été utilisé
                if ($this->orderShopRepo->countValidOrderWithReductionCredit($reductionCredit, $user) > 0) {
                        $this->utils->addFlash('error', 'error.reductionCredit.alreadyUse');
                        return false;
                }

                return true;
        }

        public function getReductionCartRemainingQuantity($reductionCart) :float
        {
                return $reductionCart->getAvailableQuantity() - $this->orderShopRepo->countValidOrderWithReductionCart();
        }

        public function getReductionCartRemainingQuantityPerUser($reductionCart) :float
        {
                return $reductionCart->getAvailableQuantityPerUser() - $this->orderShopRepo->countValidOrderWithReductionCartPerUser();
        }


        public function createOrderReductionCredit(OrderShopInterface $orderShop, ReductionCreditInterface $reductionCredit)
        {
                $orderReductionCreditClass = $this->em->getClassMetadata(OrderReductionCreditInterface::class);
                $orderReductionCredit = new $orderReductionCreditClass->name;

                $orderReductionCredit->setOrderShop($orderShop);
                $orderReductionCredit->setReductionCredit($reductionCredit);

                $orderReductionCredit->setTitle($reductionCredit->getTitle());
                $orderReductionCredit->setValue($reductionCredit->getValue());
                $orderReductionCredit->setUnit($reductionCredit->getUnit());
                $orderReductionCredit->setBehaviorTaxRate($reductionCredit->getBehaviorTaxRate());

                $orderShop->addOrderReductionCredit($orderReductionCredit) ;

                if($this->isOrderShopPositiveAmount($orderShop)) {
                        $this->em->persist($orderReductionCredit);
                        $this->em->flush();
                        return $orderReductionCredit;
                }

                return false ;
        }

        /*public function getReductionCreditsAvailable($order)
        {
                $reductionCreditRepo = $this->em->getRepository(ReductionCreditInterface::class);

                $reductionCredits = $reductionCreditRepo->getReductionCreditByUser($order->getUser());
                foreach ($reductionCredits as $reductionCredit){

                }
        }*/
        public function getReductionCreditsAvailableByUser($user)
        {
                $reductionCredits = $this->reductionCreditRepo->findReductionCreditsByUser($user) ;

                $reductionCreditsArray = [] ;
                foreach($reductionCredits as $reductionCredit) {
                        if(!$this->orderShopRepo->countValidOrderWithReductionCredit($reductionCredit, $user)) {
                                $reductionCreditsArray[] = $reductionCredit ;
                        }
                }

                return $reductionCreditsArray ;
        }

        public function isReductionCreditAddedToOrder($orderShop, $reductionCredit)
        {
                foreach($orderShop->getOrderReductionCredits() as $orderReductionCredit) {
                        if($orderReductionCredit->getReductionCredit() == $reductionCredit) {
                                return true ;
                        }
                }

                return false ;
        }

}
