<?php

namespace Lc\ShopBundle\Repository;

use Doctrine\ORM\EntityManager;
use Lc\ShopBundle\Context\DefaultRepositoryInterface;
use Lc\ShopBundle\Context\MerchantUtilsInterface;
use Lc\ShopBundle\Context\OrderUtilsInterface;
use Lc\ShopBundle\Context\ReductionCartInterface;

/**
 * @method ReductionCartInterface|null find($id, $lockMode = null, $lockVersion = null)
 * @method ReductionCartInterface|null findOneBy(array $criteria, array $orderBy = null)
 * @method ReductionCartInterface[]    findAll()
 * @method ReductionCartInterface[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class ReductionCartRepository extends BaseRepository implements DefaultRepositoryInterface
{
        protected $orderUtils ;

        public function __construct(EntityManager $entityManager, MerchantUtilsInterface $merchantUtils, OrderUtilsInterface $orderUtils)
        {
                parent::__construct($entityManager, $merchantUtils);
                $this->orderUtils = $orderUtils ;
        }

        public function getInterfaceClass()
        {
                return ReductionCartInterface::class;
        }

        public function findOneByCode($code)
        {
                $query = $this->findByMerchantQuery() ;
                $query->andWhere('e.codes LIKE :code')->setParameter('code', '%'.$code.'%') ;
                return $query->getQuery()->getOneOrNullResult() ;
        }

        public function getValuesOfFieldType(){
                $query = $this->findByMerchantQuery() ;
                $query->select('DISTINCT e.type');
                $query->andWhere('e.status = 1');

                return $query->getQuery()->getResult() ;

        }

        public function getValuesOfFieldCode(){
                $query = $this->findByMerchantQuery() ;
                $query->select('DISTINCT e.codes');
                $query->andWhere('e.status = 1');

                return $query->getQuery()->getResult() ;

        }

        public function getEligibleReductionCart($order)
        {
                $query = $this->findByMerchantQuery() ;
                $query->andWhere('e.status = 1');

                return $query->getQuery()->getResult();
        }

        public function findAllAvailableForUser($user)
        {
                $reductionCarts = $this->findAll() ;

                $reductionCartsArray = [] ;
                foreach($reductionCarts as $reductionCart) {
                        if($this->orderUtils->isReductionCartMatchWithUser($reductionCart, $user)
                                && $this->orderUtils->isReductionCartMatchWithGroupUser($reductionCart, $user)
                                && $this->orderUtils->countReductionCartAvailableForUser($reductionCart, $user)) {

                                $reductionCartsArray[] = $reductionCart ;
                        }
                }

                return $reductionCartsArray ;
        }
}