<?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>
        <!-- Api -->
        <service id="Shopware\Core\System\UsageData\Api\ConsentController" public="true">
            <argument type="service" id="Shopware\Core\System\UsageData\Consent\ConsentService"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Consent\BannerService"/>

            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
        </service>

        <!-- Services -->
        <service id="Shopware\Core\System\UsageData\Consent\ConsentService">
            <argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
            <argument type="service" id="system_config.repository"/>
            <argument type="service" id="event_dispatcher"/>
            <argument type="service" id="clock"/>
        </service>

        <service id="Shopware\Core\System\UsageData\Consent\BannerService">
            <argument type="service" id="user_config.repository"/>
        </service>

        <service id="Shopware\Core\System\UsageData\Subscriber\UsageDataApprovalSubscriber">
            <argument type="service" id="Shopware\Core\System\UsageData\Services\EntityDispatchService"/>

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

        <service id="Shopware\Core\System\UsageData\Subscriber\EntityDeleteSubscriber">
            <argument type="service" id="Shopware\Core\System\UsageData\Services\EntityDefinitionService"/>
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument type="service" id="clock"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Consent\ConsentService"/>

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

        <service id="Shopware\Core\System\UsageData\EntitySync\IterateEntityMessageHandler">
            <argument type="service" id="messenger.bus.shopware"/>
            <argument type="service" id="Shopware\Core\System\UsageData\EntitySync\IterateEntitiesQueryBuilder"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Consent\ConsentService"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Services\EntityDefinitionService"/>
            <argument type="service" id="logger"/>

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

        <service id="Shopware\Core\System\UsageData\EntitySync\DispatchEntityMessageHandler">
            <argument type="service" id="Shopware\Core\System\UsageData\Services\EntityDefinitionService"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Services\ManyToManyAssociationService"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Services\UsageDataAllowListService"/>
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument type="service" id="Shopware\Core\System\UsageData\EntitySync\EntityDispatcher"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Consent\ConsentService"/>

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

        <service id="Shopware\Core\System\UsageData\EntitySync\CollectEntityDataMessageHandler">
            <argument type="service" id="Shopware\Core\System\UsageData\Services\EntityDispatchService"/>

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

        <service id="Shopware\Core\System\UsageData\EntitySync\EntityDispatcher">
            <argument type="service" id="shopware.usage_data.gateway.client"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Services\ShopIdProvider"/>
            <argument type="service" id="Shopware\Core\Framework\Store\Services\InstanceService"/>
            <argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
            <argument type="service" id="clock"/>
            <argument>%kernel.environment%</argument>
            <argument type="string"  id="shopware.usage_data.gateway.dispatch_enabled" key="$dispatchEnabled"/>
        </service>

        <service id="Shopware\Core\System\UsageData\EntitySync\IterateEntitiesQueryBuilder">
            <argument type="service" id="Shopware\Core\System\UsageData\Services\EntityDefinitionService"/>
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument>%shopware.usage_data.gateway.batch_size%</argument>
            <argument type="service" id="logger"/>
        </service>

        <service id="Shopware\Core\System\UsageData\Services\EntityDispatchService">
            <argument type="service" id="Shopware\Core\System\UsageData\Services\EntityDefinitionService"/>
            <argument type="service" id="Shopware\Core\Framework\Adapter\Storage\AbstractKeyValueStorage"/>
            <argument type="service" id="messenger.bus.shopware"/>
            <argument type="service" id="clock"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Consent\ConsentService"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Services\GatewayStatusService"/>
        </service>

        <service id="Shopware\Core\System\UsageData\Services\ManyToManyAssociationService">
            <argument type="service" id="Doctrine\DBAL\Connection"/>
        </service>

        <service id="Shopware\Core\System\UsageData\Services\EntityDefinitionService">
            <argument type="tagged_iterator" tag="shopware.entity.definition"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Services\UsageDataAllowListService"/>
        </service>

        <service id="Shopware\Core\System\UsageData\Consent\ConsentReporter">
            <argument type="service" id="shopware.usage_data.gateway.client"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Services\ShopIdProvider"/>
            <argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
            <argument type="service" id="Shopware\Core\Framework\Store\Services\InstanceService"/>
            <argument type="string">%env(APP_URL)%</argument>
            <argument type="string"  id="shopware.usage_data.gateway.dispatch_enabled" key="$dispatchEnabled"/>

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

        <service id="Shopware\Core\System\UsageData\Services\UsageDataAllowListService"/>

        <service id="Shopware\Core\System\UsageData\Services\ShopIdProvider">
            <argument type="service" id="Shopware\Core\Framework\App\ShopId\ShopIdProvider"/>
        </service>

        <service id="Shopware\Core\System\UsageData\Services\GatewayStatusService">
            <argument type="service" id="Shopware\Core\System\UsageData\Client\GatewayClient"/>
        </service>

        <service id="Shopware\Core\System\UsageData\Client\GatewayClient">
            <argument type="service" id="shopware.usage_data.gateway.client"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Services\ShopIdProvider"/>
            <argument type="string"  id="shopware.usage_data.gateway.dispatch_enabled" key="$dispatchEnabled"/>
        </service>

        <!-- Scheduled tasks -->
        <service id="Shopware\Core\System\UsageData\ScheduledTask\CollectEntityDataTask">
            <tag name="shopware.scheduled.task"/>
        </service>

        <service id="Shopware\Core\System\UsageData\ScheduledTask\CollectEntityDataTaskHandler">
            <argument type="service" id="scheduled_task.repository"/>
            <argument type="service" id="logger"/>
            <argument type="service" id="Shopware\Core\System\UsageData\Services\EntityDispatchService"/>

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

        <!-- Clients -->
        <service id="shopware.usage_data.gateway.client" class="Symfony\Contracts\HttpClient\HttpClientInterface">
            <factory class="Symfony\Component\HttpClient\HttpClient" method="create"/>
            <argument type="collection">
                <argument key="base_uri">%shopware.usage_data.gateway.base_uri%</argument>
            </argument>
        </service>
    </services>
</container>
