<?php

namespace Lc\ShopBundle\Repository;

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepositoryInterface;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
use Lc\ShopBundle\Context\FilterMerchantInterface;
use Lc\ShopBundle\Context\FilterMultipleMerchantsInterface;
use Lc\ShopBundle\Context\MerchantUtilsInterface;
use Lc\ShopBundle\Context\StatusInterface;

class BaseRepository extends EntityRepository implements ServiceEntityRepositoryInterface
{
        public $merchantUtils;

        /**
         * @param string $entityClass The class name of the entity this repository manages
         */
        public function __construct(EntityManager $entityManager, MerchantUtilsInterface $merchantUtils)
        {
                $this->merchantUtils = $merchantUtils;
                parent::__construct($entityManager, $entityManager->getClassMetadata($this->getInterfaceClass()));
        }


        public function findByTerm($field, $term, $limit=10){
                $qb = $this->findByMerchantQuery();
                $qb->select('e.'.$field);
                $qb->andWhere(
                        $qb->expr()->like('e.'.$field, ':term'));
                $qb->setParameter('term', '%'.$term.'%');
                $qb->setMaxResults($limit);

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

        }



        public function findOneByOldUrl($url)
        {
                $qb = $this->createQueryBuilder('entity')
                        ->where('entity.oldUrls LIKE :oldUrl')
                        ->andWhere('entity.status = 1')
                        ->setParameter(':oldUrl', '%'.$url.'%');

                return $qb->getQuery()->getOneOrNullResult();
        }

        public function findByMerchantQuery() :QueryBuilder
        {
                return $this->createQueryBuilder('e')
                        ->where('e.merchant = :currentMerchant')
                        ->setParameter('currentMerchant', $this->merchantUtils->getMerchantCurrent()->getId()) ;
        }

        public function findAll()
        {
                return $this->findBy(array());
        }

        public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
        {
                $className = $this->getClassMetadata()->getName();
                $entity = new $className;

                if($entity instanceof StatusInterface){
                        if (!isset($criteria['status'])) $criteria['status'] = 1;
                        if ($criteria['status'] === false) unset($criteria['status']);
                }

                if($entity instanceof FilterMerchantInterface){
                        if (!isset($criteria['merchant'])) $criteria['merchant'] = $this->merchantUtils->getMerchantCurrent();
                        if ($criteria['merchant'] === false) unset($criteria['merchant']);
                }

                return parent::findBy($criteria, $orderBy, $limit, $offset);

        }

        public function findOneBy(array $criteria, array $orderBy = null)
        {

                $className = $this->getClassMetadata()->getName();
                $entity = new $className;

                if($entity instanceof StatusInterface){
                        if (!isset($criteria['status'])) $criteria['status'] = 1;
                        if ($criteria['status'] === false) unset($criteria['status']);
                }

                if($entity instanceof FilterMerchantInterface){
                        if (!isset($criteria['merchant'])) $criteria['merchant'] = $this->merchantUtils->getMerchantCurrent();
                        if ($criteria['merchant'] === false) unset($criteria['merchant']);
                }

                return parent::findOneBy($criteria, $orderBy);
        }

}
