<?php 
 
/* 
 * This file is part of Monsieur Biz' Search plugin for Sylius. 
 * 
 * (c) Monsieur Biz <sylius@monsieurbiz.com> 
 * 
 * For the full copyright and license information, please view the LICENSE.txt 
 * file that was distributed with this source code. 
 */ 
 
declare(strict_types=1); 
 
namespace MonsieurBiz\SyliusSearchPlugin\Search; 
 
use MonsieurBiz\SyliusSearchPlugin\Exception\UnknownRequestTypeException; 
use MonsieurBiz\SyliusSearchPlugin\Search\Request\RequestConfiguration; 
use MonsieurBiz\SyliusSearchPlugin\Search\Request\RequestHandler; 
use Pagerfanta\Elastica\ElasticaAdapter; 
use Sylius\Component\Locale\Context\LocaleContextInterface; 
 
class Search implements SearchInterface 
{ 
    private LocaleContextInterface $localeContext; 
 
    private RequestHandler $requestHandler; 
 
    private ClientFactory $clientFactory; 
 
    private ResponseFactory $responseFactory; 
 
    public function __construct( 
        ClientFactory $clientFactory, 
        LocaleContextInterface $localeContext, 
        RequestHandler $requestHandler, 
        ResponseFactory $responseFactory 
    ) { 
        $this->localeContext = $localeContext; 
        $this->requestHandler = $requestHandler; 
        $this->clientFactory = $clientFactory; 
        $this->responseFactory = $responseFactory; 
    } 
 
    /** 
     * @throws UnknownRequestTypeException 
     */ 
    public function search(RequestConfiguration $requestConfiguration): ResponseInterface 
    { 
        $request = $this->requestHandler->getRequest($requestConfiguration); 
 
        $indexName = $this->clientFactory->getIndexName($request->getDocumentable(), $this->localeContext->getLocaleCode()); 
        $client = $this->clientFactory->getClient($request->getDocumentable(), $this->localeContext->getLocaleCode()); 
 
        return $this->responseFactory->build( 
            $requestConfiguration, 
            new ElasticaAdapter($client->getIndex($indexName), $request->getQuery()), 
            $request->getDocumentable() 
        ); 
    } 
}