<?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">
    <parameters>
        <parameter key="sendinblue.base_url">https://plugin.brevo.com</parameter>
    </parameters>

    <services>
        <service id="NewsletterSendinblue\Service\SIBCookieProviderService" decorates="Shopware\Storefront\Framework\Cookie\CookieProviderInterface">
            <argument type="service" id="NewsletterSendinblue\Service\SIBCookieProviderService.inner" />
        </service>

        <service id="NewsletterSendinblue\Service\IntegrationService">
            <argument type="service" id="integration.repository"/>
            <argument type="service" id="acl_role.repository"/>
            <argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
        </service>

        <service class="NewsletterSendinblue\Service\ConfigService" id="NewsletterSendinblue\Service\ConfigService">
            <argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
            <argument>%sendinblue.base_url%</argument>
        </service>

        <service id="NewsletterSendinblue\Controller\Api\ProductSyncController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="system_config.repository"/>
            <argument type="service" id="product.repository"/>
            <argument type="service" id="NewsletterSendinblue\Service\ProductSyncService"/>
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>
        <service id="NewsletterSendinblue\Controller\Api\CategorySyncController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="system_config.repository"/>
            <argument type="service" id="category.repository"/>
            <argument type="service" id="sales_channel.repository"/>
            <argument type="service" id="NewsletterSendinblue\Service\CategorySyncService"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>
        <service id="NewsletterSendinblue\Controller\Api\OrderSyncController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="system_config.repository"/>
            <argument type="service" id="order.repository"/>
            <argument type="service" id="NewsletterSendinblue\Service\OrderSyncService"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>

        <service id="NewsletterSendinblue\Controller\Api\CallbackController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
        </service>

        <service id="NewsletterSendinblue\Controller\Api\CustomerFieldController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="Shopware\Core\Framework\DataAbstractionLayer\DefinitionInstanceRegistry"/>
            <argument type="service" id="Shopware\Core\System\CustomField\Aggregate\CustomFieldSet\CustomFieldSetDefinition"/>
            <argument type="service" id="customer.repository"/>
        </service>

        <service id="NewsletterSendinblue\Controller\Api\ProductFieldController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="Sendinblue.logger"/>
            <argument type="service" id="Shopware\Core\Framework\DataAbstractionLayer\DefinitionInstanceRegistry"/>
            <argument type="service" id="Shopware\Core\System\CustomField\Aggregate\CustomFieldSet\CustomFieldSetDefinition"/>
            <argument type="service" id="Shopware\Core\Content\Product\ProductDefinition"/>
            <argument type="service" id="Shopware\Storefront\Framework\Routing\Router"/>
        </service>

        <service id="NewsletterSendinblue\Controller\Api\ProductController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="Sendinblue.logger"/>
            <argument type="service" id="NewsletterSendinblue\Controller\Api\ProductFieldController"/>
            <argument type="service" id="product.repository"/>
            <argument type="service" id="currency.repository"/>
        </service>

        <service id="NewsletterSendinblue\Controller\Api\CustomerController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="NewsletterSendinblue\Controller\Api\CustomerFieldController"/>
            <argument type="service" id="system_config.repository"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="NewsletterSendinblue\Service\Customer\AllCustomerService"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>

        <service id="NewsletterSendinblue\Controller\BackendController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="NewsletterSendinblue\Service\IntegrationService"/>
            <argument type="service" id="sales_channel.repository"/>
            <argument type="service" id="sales_channel_domain.repository"/>
            <argument type="service" id="NewsletterSendinblue\Service\VersionProvider"/>
        </service>

        <service id="NewsletterSendinblue\Controller\SendInBlueController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument>%sendinblue.service_worker_path%</argument>
        </service>

        <service id="NewsletterSendinblue\Controller\BackInStockSubscriptionController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="brevo_back_in_stock_subscription.repository"/>
            <argument type="service" id="product.repository"/>
            <argument type="service" id="validator"/>
            <argument type="service" id="system_config.repository"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="NewsletterSendinblue\Service\ApiClientService"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>

        <service id="NewsletterSendinblue\Controller\Api\PluginController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="NewsletterSendinblue\Service\VersionProvider"/>
            <argument type="service" id="system_config.repository"/>
        </service>

        <service id="NewsletterSendinblue\Controller\Api\ConversionTrackingController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
        </service>

        <service id="NewsletterSendinblue\Controller\Api\ConfigController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="system_config.repository"/>
        </service>

        <service id="NewsletterSendinblue\Controller\Api\GroupController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="NewsletterSendinblue\Service\ApiClientService"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>

        <service id="NewsletterSendinblue\Controller\Api\SendTestMailController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="NewsletterSendinblue\Service\VersionProvider"/>
            <argument type="service" id="system_config.repository"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>

        <service id="NewsletterSendinblue\Subscriber\MarketingAutomationSubscriber">
            <tag name="kernel.event_subscriber"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
        </service>

        <service id="NewsletterSendinblue\Subscriber\AbandonedCartSubscriber">
            <tag name="kernel.event_subscriber"/>
            <argument type="service" id="Shopware\Core\Checkout\Cart\SalesChannel\CartService"/>
            <argument type="service" id="NewsletterSendinblue\Service\Cart\CartEventProducer"/>
            <argument type="service" id="NewsletterSendinblue\Service\Cart\SendinblueCartProcessorService"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="Shopware\Core\Checkout\Cart\CartPersister"/>
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument type="service" id="brevo_abandoned_cart.repository"/>
            <argument type="service" id="request_stack"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>

        <service id="NewsletterSendinblue\Subscriber\CartOrderSubscriber">
            <tag name="kernel.event_subscriber"/>
            <argument type="service" id="Shopware\Core\System\SalesChannel\Context\SalesChannelContextFactory"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="NewsletterSendinblue\Service\Cart\CartEventProducer"/>
            <argument type="service" id="NewsletterSendinblue\Service\Customer\CustomerProducer"/>
            <argument type="service" id="system_config.repository"/>
            <argument type="service" id="order_transaction.repository"/>
            <argument type="service" id="NewsletterSendinblue\Service\OrderSyncService"/>
            <argument type="service" id="Sendinblue.logger"/>
            <argument type="service" id="brevo_abandoned_cart.repository"/>
            <argument type="service" id="NewsletterSendinblue\Service\ProductSyncService"/>
            <argument type="service" id="request_stack"/>
        </service>

        <!-- LOGGER -->
        <service id="Sendinblue.logger" class="Monolog\Logger">
            <argument type="string">Sendinblue</argument>
            <argument type="collection">
                <argument type="service" id="Sendinblue.rotatingHandler"/>
            </argument>
        </service>
        <service id="Sendinblue.rotatingHandler" class="Monolog\Handler\RotatingFileHandler">
            <argument type="string">%kernel.logs_dir%/sendinblue-%kernel.environment%.log</argument>
        </service>

        <service id="NewsletterSendinblue\Service\VersionProvider">
            <argument>%kernel.shopware_version%</argument>
            <argument type="service" id="plugin.repository"/>
        </service>

        <service id="NewsletterSendinblue\Service\ApiClientService">
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="Sendinblue.logger"/>
            <argument type="service" id="NewsletterSendinblue\Service\VersionProvider"/>
        </service>

        <service id="NewsletterSendinblue\Service\Cart\SendinblueCartProcessorService" shared="true">
            <tag name="shopware.cart.processor" priority="10"/>
            <argument type="service" id="NewsletterSendinblue\Service\Cart\CartEventProducer"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>

        <service id="NewsletterSendinblue\Service\Cart\CartEventProducer">
            <argument type="service" id="NewsletterSendinblue\Service\Cart\CartPayloadCollector"/>
            <argument type="service" id="NewsletterSendinblue\Service\ApiClientService"/>
            <argument type="service" id="newsletter_recipient.repository"/>
            <argument type="service" id="Sendinblue.logger"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
        </service>

        <service id="NewsletterSendinblue\Service\Cart\CartPayloadCollector">
            <argument type="service" id="product.repository"/>
            <argument type="service" id="Shopware\Storefront\Framework\Routing\Router"/>
            <argument type="service" id="Shopware\Core\Content\Seo\SeoUrlPlaceholderHandlerInterface"/>
        </service>

        <service id="NewsletterSendinblue\Service\Product\ProductViewedProducer">
            <argument type="service" id="NewsletterSendinblue\Service\ApiClientService"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="Sendinblue.logger"/>
            <argument type="service" id="request_stack"/>
            <argument type="service" id="product.repository"/>
            <argument type="service" id="Shopware\Core\Content\Seo\SeoUrlPlaceholderHandlerInterface"/>
        </service>

        <service id="NewsletterSendinblue\Subscriber\NewsletterRecipientSubscriber">
            <tag name="kernel.event_subscriber"/>
            <argument type="service" id="NewsletterSendinblue\Service\NewsletterRecipient\NewsletterRecipientProducer"/>
            <argument type="service" id="NewsletterSendinblue\Service\Customer\CustomerProducer"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
            <argument type="service" id="mail_template.repository"/>
            <argument type="service" id="customer.repository"/>
            <argument type="service" id="request_stack"/>
            <argument type="service" id="NewsletterSendinblue\Service\Cart\SendinblueCartProcessorService"/>
            <argument type="service" id="NewsletterSendinblue\Service\Cart\CartEventProducer"/>
            <argument type="service" id="Shopware\Core\Checkout\Cart\SalesChannel\CartService"/>
        </service>

        <service id="NewsletterSendinblue\Subscriber\MailerSettingsChangeSubscriber">
            <tag name="kernel.event_subscriber"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="NewsletterSendinblue\Service\ApiClientService"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>

        <service id="NewsletterSendinblue\Subscriber\PreWriteValidationSubscriber">
            <argument type="service" id="NewsletterSendinblue\Service\ProductSyncService"/>
            <argument type="service" id="NewsletterSendinblue\Service\CategorySyncService"/>
            <tag name="kernel.event_subscriber"/>
        </service>
        <service id="NewsletterSendinblue\Subscriber\ProductSubscriber">
            <argument type="service" id="NewsletterSendinblue\Service\ProductSyncService"/>
            <argument type="service" id="system_config.repository"/>
            <argument type="service" id="request_stack"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="Sendinblue.logger"/>
            <argument type="service" id="messenger.default_bus"/>
            <argument type="service" id="NewsletterSendinblue\Service\Product\ProductViewedProducer"/>
            <tag name="kernel.event_subscriber"/>
        </service>
        <service id="NewsletterSendinblue\Subscriber\CategorySubscriber">
            <argument type="service" id="NewsletterSendinblue\Service\CategorySyncService"/>
            <argument type="service" id="system_config.repository"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="Sendinblue.logger"/>
            <argument type="service" id="messenger.default_bus"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="NewsletterSendinblue\Service\NewsletterRecipient\NewsletterRecipientProducer">
            <argument type="service" id="NewsletterSendinblue\Service\ApiClientService"/>
            <argument type="service" id="newsletter_recipient.repository"/>
            <argument type="service" id="NewsletterSendinblue\Service\NewsletterRecipient\NewsletterRecipientPayloadCollector"/>
            <argument type="service" id="NewsletterSendinblue\Service\Customer\AllCustomerService"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>

        <service id="NewsletterSendinblue\Service\NewsletterRecipient\NewsletterRecipientPayloadCollector" >
            <argument type="service" id="NewsletterSendinblue\Controller\Api\CustomerFieldController"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>

        <!-- CUSTOMER -->
        <service id="NewsletterSendinblue\Service\Customer\CustomerProducer">
            <argument type="service" id="NewsletterSendinblue\Service\ApiClientService"/>
            <argument type="service" id="customer.repository"/>
            <argument type="service" id="NewsletterSendinblue\Service\Customer\CustomerPayloadCollector"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="NewsletterSendinblue\Service\Customer\AllCustomerService"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>
        <service id="NewsletterSendinblue\Service\Customer\CustomerPayloadCollector" >
            <argument type="service" id="NewsletterSendinblue\Controller\Api\CustomerFieldController"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>
        <service id="NewsletterSendinblue\Service\Customer\AllCustomerService">
            <argument type="service" id="customer.repository"/>
            <argument type="service" id="newsletter_recipient.repository"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>

        <!-- Decorators -->
        <service id="NewsletterSendinblue\Content\Newsletter\SalesChannel\NewsletterSubscribeRoute"
                 decorates="Shopware\Core\Content\Newsletter\SalesChannel\NewsletterSubscribeRoute"
                 public="false">
            <argument type="service" id="NewsletterSendinblue\Content\Newsletter\SalesChannel\NewsletterSubscribeRoute.inner"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
            <argument type="service" id="request_stack"/>
        </service>

        <!-- SYNC_SERVICES -->
        <service id="NewsletterSendinblue\Service\BaseSyncService" abstract="true">
            <call method="setApiClient">
                <argument type="service" id="NewsletterSendinblue\Service\ApiClientService"/>
            </call>
            <call method="setLogger">
                <argument type="service" id="Sendinblue.logger"/>
            </call>
        </service>
        <service id="NewsletterSendinblue\Service\ProductSyncService"
                 parent="NewsletterSendinblue\Service\BaseSyncService">
            <argument type="service" id="product.repository"/>
            <argument type="service" id="category.repository"/>
            <argument type="service" id="Doctrine\DBAL\Connection"/>
        </service>
        <service id="NewsletterSendinblue\Service\CategorySyncService"
                 parent="NewsletterSendinblue\Service\BaseSyncService">
            <argument type="service" id="category.repository"/>
        </service>

        <service id="NewsletterSendinblue\Service\OrderSyncService">
            <argument type="service" id="NewsletterSendinblue\Service\ApiClientService"/>
            <argument type="service" id="order.repository"/>
            <argument type="service" id="order_address.repository"/>
            <argument type="service" id="Sendinblue.logger"/>
        </service>

        <!-- DEFINITIONS -->
        <service id="NewsletterSendinblue\Core\Content\Cart\AbandonedCartDefinition">
            <tag name="shopware.entity.definition" entity="brevo_abandoned_cart"/>
        </service>

        <service id="NewsletterSendinblue\Core\Content\BackInStockSubscription\BackInStockSubscriptionDefinition">
            <tag name="shopware.entity.definition" entity="brevo_back_in_stock_subscription"/>
        </service>

        <!-- MESSAGE HANDLERS -->
        <service id="NewsletterSendinblue\Message\Category\CategorySyncMessageHandler">
            <argument type="service" id="NewsletterSendinblue\Service\CategorySyncService"/>
            <tag name="messenger.message_handler"/>
        </service>
        <service id="NewsletterSendinblue\Message\Product\ProductSyncMessageHandler">
            <argument type="service" id="NewsletterSendinblue\Service\ProductSyncService"/>
            <tag name="messenger.message_handler"/>
        </service>
        <service id="NewsletterSendinblue\Message\Product\ProductSyncDeleteMessageHandler">
            <argument type="service" id="NewsletterSendinblue\Service\ProductSyncService"/>
            <tag name="messenger.message_handler"/>
        </service>

        <service id="NewsletterSendinblue\Message\StructCollectionMessageJsonSerializer">
            <tag name="serializer.normalizer"/>
        </service>

        <!-- TWIG EXTENSIONS -->
        <service id="NewsletterSendinblue\Twig\BrevoTwigExtension" public="true">
            <argument type="service" id="system_config.repository"/>
            <argument type="service" id="NewsletterSendinblue\Service\ConfigService"/>
            <argument type="service" id="Sendinblue.logger"/>
            <argument type="service" id="brevo_back_in_stock_subscription.repository"/>
            <tag name="twig.extension"/>
        </service>

        <!-- SCHEDULED TASK -->
        <service id="NewsletterSendinblue\ScheduledTask\BackInStock\SubscriptionCleanupTask">
            <tag name="shopware.scheduled.task" />
        </service>
        <service id="NewsletterSendinblue\ScheduledTask\BackInStock\SubscriptionCleanupTaskHandler">
            <argument type="service" id="scheduled_task.repository"/>
            <argument type="service" id="brevo_back_in_stock_subscription.repository"/>
            <argument type="service" id="product.repository"/>
            <argument type="service" id="Sendinblue.logger"/>
            <tag name="messenger.message_handler" />
        </service>

    </services>
</container>
