<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="Shopware\Core\Framework\Adapter\Cache\CacheStateSubscriber">
            <argument type="service" id="Shopware\Core\Checkout\Cart\SalesChannel\CartService"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="shopware.cache.invalidator.storage.redis_adapter" class="Redis" public="true">
            <factory service="Shopware\Core\Framework\Adapter\Redis\RedisConnectionProvider" method="getConnection"/>
            <argument>%shopware.cache.invalidation.delay_options.connection%</argument>
        </service>

        <service id="shopware.cache.invalidator.storage.redis" class="Shopware\Core\Framework\Adapter\Cache\InvalidatorStorage\RedisInvalidatorStorage" lazy="true">
            <argument type="service" id="shopware.cache.invalidator.storage.redis_adapter"/>
            <tag name="shopware.cache.invalidator.storage" storage="redis"/>
        </service>

        <service id="shopware.cache.invalidator.storage.mysql" class="Shopware\Core\Framework\Adapter\Cache\InvalidatorStorage\MySQLInvalidatorStorage" lazy="true">
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument type="service" id="logger"/>

            <tag name="shopware.cache.invalidator.storage" storage="mysql"/>
        </service>

        <service id="shopware.cache.invalidator.storage.locator" class="Shopware\Core\Framework\DependencyInjection\TaggedServiceLocator">
            <argument type="tagged_locator" tag="shopware.cache.invalidator.storage" index-by="storage" />
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\InvalidatorStorage\AbstractInvalidatorStorage">
            <factory service="shopware.cache.invalidator.storage.locator" method="get"/>

            <argument>%shopware.cache.invalidation.delay_options.storage%</argument>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\CacheInvalidator" public="true" lazy="true">
            <argument type="collection">
                <argument type="service" id="cache.object"/>
                <argument type="service" id="cache.http"/>
            </argument>
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\InvalidatorStorage\AbstractInvalidatorStorage"/>
            <argument type="service" id="event_dispatcher"/>
            <argument type="service" id="Psr\Log\LoggerInterface"/>
            <argument type="service" id="request_stack"/>
            <argument type="service" id="cache.http"/>
            <argument>%shopware.http_cache.soft_purge%</argument>
            <argument>%shopware.cache.invalidation.delay_enabled%</argument>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\InvalidateCacheTask">
            <tag name="shopware.scheduled.task" />
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\InvalidateCacheTaskHandler">
            <argument type="service" id="scheduled_task.repository"/>
            <argument type="service" id="logger"/>
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\CacheInvalidator"/>

            <tag name="messenger.message_handler"/>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\CacheClearer">
            <argument type="collection">
                <argument type="service" key="object" id="cache.object"/>
                <argument type="service" key="http" id="cache.http"/>
            </argument>
            <argument type="service" id="cache_clearer"/>
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\ReverseProxy\AbstractReverseProxyGateway" on-invalid="null"/>
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\CacheInvalidator"/>
            <argument type="service" id="filesystem"/>
            <argument>%kernel.cache_dir%</argument>
            <argument>%kernel.environment%</argument>
            <argument>%shopware.deployment.cluster_setup%</argument>
            <argument>%shopware.http_cache.reverse_proxy.enabled%</argument>
            <argument type="service" id="messenger.default_bus"/>
            <argument type="service" id="logger"/>
            <argument type="service" id="lock.factory"/>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\Message\CleanupOldCacheFoldersHandler">
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\CacheClearer"/>

            <tag name="messenger.message_handler"/>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\Message\RefreshHttpCacheMessageHandler">
            <argument type="service" id="http_kernel.cache.inner"/>
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\Http\CacheStore"/>
            <argument type="service" id="cache.http"/>

            <tag name="messenger.message_handler"/>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\Script\Facade\CacheInvalidatorFacadeHookFactory" public="true">
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\CacheInvalidator"/>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\Script\ScriptCacheInvalidationSubscriber">
            <argument type="service" id="Shopware\Core\Framework\Script\Execution\ScriptExecutor"/>

            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\CacheInvalidationSubscriber">
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\CacheInvalidator"/>
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument>%shopware.product_stream.indexing%</argument>

            <tag name="kernel.event_listener" event="Shopware\Core\Content\Category\Event\CategoryIndexerEvent" method="invalidateCategoryRouteByCategoryIds" priority="2000" />
            <tag name="kernel.event_listener" event="Shopware\Core\Content\LandingPage\Event\LandingPageIndexerEvent" method="invalidateIndexedLandingPages" priority="2000" />

            <tag name="kernel.event_listener" event="Shopware\Core\Content\Product\Events\InvalidateProductCache" method="invalidateProduct" priority="2001" />

            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateCmsPageIds" priority="2001" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateCurrencyRoute" priority="2002" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateLanguageRoute" priority="2003" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateNavigationRoute" priority="2004" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidatePaymentMethodRoute" priority="2005" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateManufacturerFilters" priority="2007" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidatePropertyFilters" priority="2008" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateContext" priority="2010" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateShippingMethodRoute" priority="2011" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateSnippets" priority="2012" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateStreamsBeforeIndexing" priority="2013" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateStreamIds" priority="2014" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateCountryRoute" priority="2015" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateSalutationRoute" priority="2016" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateInitialStateIdLoader" priority="2017" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent" method="invalidateCountryStateRoute" priority="2018" />
            <tag name="kernel.event_listener" event="Shopware\Core\Content\Rule\Event\RuleIndexerEvent" method="invalidateRules" priority="2000" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\Plugin\Event\PluginPostInstallEvent" method="invalidateRules" priority="2000" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\Plugin\Event\PluginPostInstallEvent" method="invalidateConfig" priority="2001" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\Plugin\Event\PluginPostActivateEvent" method="invalidateRules" priority="2000" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\Plugin\Event\PluginPostActivateEvent" method="invalidateConfig" priority="2001" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\Plugin\Event\PluginPostUpdateEvent" method="invalidateRules" priority="2000" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\Plugin\Event\PluginPostUpdateEvent" method="invalidateConfig" priority="2001" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\Plugin\Event\PluginPostDeactivateEvent" method="invalidateRules" priority="2000" />
            <tag name="kernel.event_listener" event="Shopware\Core\Framework\Plugin\Event\PluginPostDeactivateEvent" method="invalidateConfig" priority="2001" />
            <tag name="kernel.event_listener" event="Shopware\Core\System\SystemConfig\Event\SystemConfigChangedHook" method="invalidateConfigKey" priority="2000" />
            <tag name="kernel.event_listener" event="Shopware\Core\Content\Sitemap\Event\SitemapGeneratedEvent" method="invalidateSitemap" priority="2000" />
            <tag name="kernel.event_listener" event="Shopware\Core\Content\Media\Event\MediaIndexerEvent" method="invalidateMedia" priority="2000" />
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\CacheTagCollector">
            <argument type="service" id="request_stack"/>
            <argument type="service" id="event_dispatcher"/>
            <tag name="kernel.event_listener" />
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\CacheTagCollection"/>

        <service id="Shopware\Core\Framework\Adapter\Cache\Http\CacheResponseSubscriber">
            <argument>%shopware.http_cache.cookies%</argument>
            <argument type="service" id="Shopware\Core\Checkout\Cart\SalesChannel\CartService"/>
            <argument>%shopware.http.cache.default_ttl%</argument>
            <argument>%shopware.http.cache.enabled%</argument>
            <argument type="service" id="Shopware\Core\Framework\Routing\MaintenanceModeResolver"/>
            <argument type="service" id="Symfony\Component\HttpFoundation\RequestStack"/>
            <argument>%shopware.http_cache.stale_while_revalidate%</argument>
            <argument>%shopware.http_cache.stale_if_error%</argument>
            <argument type="service" id="event_dispatcher"/>

            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="esi" class="Shopware\Core\Framework\Adapter\Kernel\EsiDecoration" />

        <service id="Shopware\Core\Framework\Adapter\Cache\Http\CacheControlListener" autoconfigure="true" autowire="true">
            <argument>%shopware.http_cache.reverse_proxy.enabled%</argument>

            <tag name="kernel.event_listener" event="Shopware\Core\Framework\Event\BeforeSendResponseEvent" />
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\ReverseProxy\ReverseProxyCache">
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\ReverseProxy\AbstractReverseProxyGateway"/>
            <argument>%shopware.cache.invalidation.http_cache%</argument>
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\CacheTagCollector"/>
            <tag name="kernel.event_listener"/>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Command\CacheInvalidateDelayedCommand">
            <tag name="console.command"/>
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\CacheInvalidator"/>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Command\CacheClearAllCommand">
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\CacheClearer"/>
            <argument>%kernel.environment%</argument>
            <argument>%kernel.debug%</argument>
            <tag name="console.command"/>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Command\CacheClearHttpCommand">
            <argument type="service" id="Shopware\Core\Framework\Adapter\Cache\CacheClearer" />
            <tag name="console.command"/>
        </service>

        <service id="shopware.reverse_proxy.http_client" class="GuzzleHttp\Client"/>

        <service id="Shopware\Core\Framework\Adapter\Cache\ReverseProxy\AbstractReverseProxyGateway" class="Shopware\Core\Framework\Adapter\Cache\ReverseProxy\VarnishReverseProxyGateway">
            <argument>%shopware.http_cache.reverse_proxy.hosts%</argument>
            <argument>%shopware.http_cache.reverse_proxy.max_parallel_invalidations%</argument>
            <argument type="service" id="shopware.reverse_proxy.http_client"/>
            <argument type="service" id="logger"/>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\ReverseProxy\FastlyReverseProxyGateway">
            <argument type="service" id="shopware.reverse_proxy.http_client"/>
            <argument>%shopware.http_cache.reverse_proxy.fastly.service_id%</argument>
            <argument>%shopware.http_cache.reverse_proxy.fastly.api_key%</argument>
            <argument>%shopware.http_cache.reverse_proxy.fastly.soft_purge%</argument>
            <argument>%shopware.http_cache.reverse_proxy.max_parallel_invalidations%</argument>
            <argument>%shopware.http_cache.reverse_proxy.fastly.tag_prefix%</argument>
            <argument>%shopware.http_cache.reverse_proxy.fastly.instance_tag%</argument>
            <argument>%env(APP_URL)%</argument>
            <argument type="service" id="logger"/>
        </service>

        <service id="Shopware\Core\Framework\Adapter\Cache\Telemetry\CacheTelemetrySubscriber">
            <argument type="service" id="Shopware\Core\Framework\Telemetry\Metrics\Meter" />

            <tag name="kernel.event_subscriber"/>
        </service>
    </services>
</container>
