<?php declare(strict_types=1); 
 
namespace Shopware\Core\Content\Flow\Dispatching; 
 
use Shopware\Core\Content\Flow\FlowEvents; 
use Shopware\Core\Framework\Adapter\Cache\CacheValueCompressor; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Contracts\Cache\CacheInterface; 
use Symfony\Contracts\Cache\ItemInterface; 
use Symfony\Contracts\Service\ResetInterface; 
 
/** 
 * @internal not intended for decoration or replacement 
 */ 
class CachedFlowLoader extends AbstractFlowLoader implements EventSubscriberInterface, ResetInterface 
{ 
    public const KEY = 'flow-loader'; 
 
    private array $flows = []; 
 
    private AbstractFlowLoader $decorated; 
 
    private CacheInterface $cache; 
 
    public function __construct( 
        AbstractFlowLoader $decorated, 
        CacheInterface $cache 
    ) { 
        $this->decorated = $decorated; 
        $this->cache = $cache; 
    } 
 
    /** 
     * @return array<string, string|array{0: string, 1: int}|list<array{0: string, 1?: int}>> 
     */ 
    public static function getSubscribedEvents() 
    { 
        return [ 
            FlowEvents::FLOW_WRITTEN_EVENT => 'invalidate', 
        ]; 
    } 
 
    public function getDecorated(): AbstractFlowLoader 
    { 
        return $this->decorated; 
    } 
 
    public function load(): array 
    { 
        if (!empty($this->flows)) { 
            return $this->flows; 
        } 
 
        $value = $this->cache->get(self::KEY, function (ItemInterface $item) { 
            $item->tag([self::KEY]); 
 
            return CacheValueCompressor::compress($this->getDecorated()->load()); 
        }); 
 
        return $this->flows = CacheValueCompressor::uncompress($value); 
    } 
 
    public function invalidate(): void 
    { 
        $this->reset(); 
        $this->cache->delete(self::KEY); 
    } 
 
    public function reset(): void 
    { 
        $this->flows = []; 
    } 
}