<?php declare(strict_types=1); 
 
namespace Shopware\Core\Checkout\Document\Service; 
 
use Shopware\Core\Checkout\Document\Aggregate\DocumentBaseConfig\DocumentBaseConfigCollection; 
use Shopware\Core\Checkout\Document\Aggregate\DocumentBaseConfig\DocumentBaseConfigEntity; 
use Shopware\Core\Checkout\Document\DocumentConfiguration; 
use Shopware\Core\Checkout\Document\DocumentConfigurationFactory; 
use Shopware\Core\Framework\Context; 
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface; 
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; 
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Contracts\Service\ResetInterface; 
 
final class DocumentConfigLoader implements EventSubscriberInterface, ResetInterface 
{ 
    private array $configs = []; 
 
    private EntityRepositoryInterface $documentConfigRepository; 
 
    /** 
     * @internal 
     */ 
    public function __construct(EntityRepositoryInterface $documentConfigRepository) 
    { 
        $this->documentConfigRepository = $documentConfigRepository; 
    } 
 
    public static function getSubscribedEvents(): array 
    { 
        return [ 
            'document_base_config.written' => 'reset', 
        ]; 
    } 
 
    public function load(string $documentType, string $salesChannelId, Context $context): DocumentConfiguration 
    { 
        if (!empty($this->configs[$documentType][$salesChannelId])) { 
            return $this->configs[$documentType][$salesChannelId]; 
        } 
 
        $criteria = new Criteria(); 
 
        $criteria->addFilter(new EqualsFilter('documentType.technicalName', $documentType)); 
        $criteria->addAssociation('logo'); 
        $criteria->getAssociation('salesChannels')->addFilter(new EqualsFilter('salesChannelId', $salesChannelId)); 
 
        /** @var DocumentBaseConfigCollection $documentConfigs */ 
        $documentConfigs = $this->documentConfigRepository->search($criteria, $context)->getEntities(); 
 
        $globalConfig = $documentConfigs->filterByProperty('global', true)->first(); 
 
        $salesChannelConfig = $documentConfigs->filter(function (DocumentBaseConfigEntity $config) { 
            return $config->getSalesChannels()->count() > 0; 
        })->first(); 
 
        $config = DocumentConfigurationFactory::createConfiguration([], $globalConfig, $salesChannelConfig); 
 
        $this->configs[$documentType] = $this->configs[$documentType] ?? []; 
 
        return $this->configs[$documentType][$salesChannelId] = $config; 
    } 
 
    public function reset(): void 
    { 
        $this->configs = []; 
    } 
}