<?php

namespace Lc\CaracoleBundle\Repository;

use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Lc\CaracoleBundle\Doctrine\Extension\FilterMerchantInterface;
use Lc\CaracoleBundle\Doctrine\Extension\FilterSectionInterface;
use Lc\CaracoleBundle\Resolver\MerchantResolver;
use Lc\CaracoleBundle\Resolver\SectionResolver;
use Lc\SovBundle\Repository\AbstractRepository as SovAbstractRepository;

trait RepositoryTrait
{
    protected $merchantResolver;
    protected $sectionResolver;

    public function __construct(
            ManagerRegistry $managerRegistry,
            SectionResolver $sectionResolver,
            MerchantResolver $merchantResolver
    ) {
        parent::__construct($managerRegistry);
        $this->merchantResolver = $merchantResolver;
        $this->sectionResolver = $sectionResolver;
    }


    protected function setCriteria(array $criteria) :array
    {
        $criteria = parent::setCriteria($criteria);

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

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

        if ($entity instanceof FilterSectionInterface) {
            if (!isset($criteria['section'])) {
                $criteria['section'] = $this->sectionResolver->getCurrent();
            }
            if ($criteria['section'] === false) {
                unset($criteria['section']);
            }
        }
        return $criteria;
    }

}