<?php

namespace Lc\ShopBundle\Repository;

use Lc\ShopBundle\Context\DefaultRepositoryInterface;
use Lc\ShopBundle\Context\ReductionCatalogInterface;
use Symfony\Component\Validator\Constraints\DateTime;

/**
 * @method ReductionCatalogInterface|null find($id, $lockMode = null, $lockVersion = null)
 * @method ReductionCatalogInterface|null findOneBy(array $criteria, array $orderBy = null)
 * @method ReductionCatalogInterface[]    findAll()
 * @method ReductionCatalogInterface[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class ReductionCatalogRepository extends BaseRepository implements DefaultRepositoryInterface
{
        public function getInterfaceClass()
        {
                return ReductionCatalogInterface::class;
        }


        public function getReductionCatalogByProductFamily($productFamily, $user)
        {
                $query = $this->findByMerchantQuery();
                $query->andWhere('e.status = 1');
                $query->andWhere(':user MEMBER OF e.users OR e.users is empty');
                $query->andWhere(':groupUser MEMBER OF e.groupUsers OR e.groupUsers is empty');
                $query->andWhere(':productFamily MEMBER OF e.productFamilies OR e.productFamilies is empty');
                $query->andWhere(':productCategory MEMBER OF e.productCategories OR e.productCategories is empty');
                $query->andWhere(':supplier MEMBER OF e.suppliers OR e.suppliers is empty');
                $query->setParameter('user', $user);
                $query->setParameter('groupUser', $user->getGroupUsers());
                $query->setParameter('productFamily', $productFamily);
                $query->setParameter('productCategory', $productFamily->getProductCategories());
                $query->setParameter('supplier', $productFamily->getSupplier());

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


        public function getReductionCatalogByProductFamilyConditions($productFamilyIds, $user)
        {
                $query = $this->findByMerchantQuery();

                $query->andWhere('e.status = 1');
                $query->andWhere('e.permanent = 1 OR (e.dateStart <= :now AND e.dateEnd >= :now)');

                $query->leftJoin('e.productFamilies', 'pfs') ;
                $query->addSelect('pfs') ;

                $query->leftJoin('e.productFamily', 'pf') ;
                $query->addSelect('pf') ;

                $query->leftJoin('e.productCategories', 'pc') ;
                $query->addSelect('pc') ;

                if($user){
                        $query->andWhere(':user MEMBER OF e.users OR e.users is empty');
                        $query->andWhere(':groupUser MEMBER OF e.groupUsers OR e.groupUsers is empty');
                        $query->setParameter('user', $user);
                        $query->setParameter('groupUser', $user->getGroupUsers());
                }

                $query->andWhere(':productFamily MEMBER OF e.productFamilies OR e.productFamilies is empty');
                $query->andWhere(':productCategory MEMBER OF e.productCategories OR e.productCategories is empty');
                $query->andWhere(':supplier MEMBER OF e.suppliers OR e.suppliers is empty');
                $query->setParameter('productFamily', $productFamilyIds['ids']);
                $query->setParameter('productCategory', $productFamilyIds['categories']);
                $query->setParameter('supplier', $productFamilyIds['suppliers']);
                $query->setParameter(':now', new \DateTime());

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