<?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>
        <defaults autowire="true" autoconfigure="true" public="false"/>

        <!-- Replace SwagPayPal's PurchaseUnitProvider with our subclass.
             LoePurchaseUnitProvider extends PurchaseUnitProvider (required because
             PurchaseUnitPatchBuilder type-hints the concrete class) and appends a
             deterministic suffix to the PayPal invoice_id for supplement orders,
             preventing DUPLICATE_INVOICE_ID errors on repeated order numbers. -->
        <service id="Swag\PayPal\OrdersApi\Builder\Util\PurchaseUnitProvider"
                 class="SellopsLimitedOrderEditing\PayPal\LoePurchaseUnitProvider"/>

        <service id="SellopsLimitedOrderEditing\Service\CustomFieldInstaller">
            <argument type="service" id="custom_field_set.repository"/>
        </service>

        <service id="SellopsLimitedOrderEditing\Service\AllowedShippingCountriesProvider">
            <argument type="service" id="sales_channel.repository"/>
        </service>

        <service id="SellopsLimitedOrderEditing\Service\OrderStateInstaller" public="true">
            <argument type="service" id="state_machine.repository"/>
            <argument type="service" id="state_machine_state.repository"/>
            <argument type="service" id="state_machine_transition.repository"/>
            <argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
            <argument type="service" id="sales_channel.repository"/>
        </service>

        <service id="SellopsLimitedOrderEditing\Subscriber\OrderPlacedSubscriber">
            <argument type="service" id="order.repository"/>
            <argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
            <argument type="service" id="Shopware\Core\System\StateMachine\StateMachineRegistry"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="SellopsLimitedOrderEditing\Subscriber\SystemConfigLabelSubscriber">
            <argument type="service" id="SellopsLimitedOrderEditing\Service\OrderStateInstaller"/>
            <argument type="service" id="logger"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="SellopsLimitedOrderEditing\Subscriber\AllowedShippingCountriesSubscriber">
            <argument type="service" id="SellopsLimitedOrderEditing\Service\AllowedShippingCountriesProvider"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="SellopsLimitedOrderEditing\Subscriber\EditableProductsSubscriber">
            <argument type="service" id="sales_channel.product.repository"/>
            <argument type="service" id="order.repository"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="SellopsLimitedOrderEditing\Subscriber\OrdersWithChildrenSubscriber">
            <argument type="service" id="order.repository"/>
            <argument type="service" id="sellops_order_modification_tracking.repository"/>
            <argument type="service" id="monolog.logger"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="SellopsLimitedOrderEditing\Subscriber\ModifyOrderSubscriber">
            <argument type="service" id="order.repository"/>
            <argument type="service" id="request_stack"/>
            <argument type="service" id="monolog.logger"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="SellopsLimitedOrderEditing\Subscriber\AddToExistingOrderSubscriber">
            <argument type="service" id="order.repository"/>
            <argument type="service" id="request_stack"/>
            <argument type="service" id="Shopware\Core\System\SalesChannel\SalesChannel\ContextSwitchRoute"/>
            <argument type="service" id="customer_address.repository"/>
            <argument type="service" id="logger"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="SellopsLimitedOrderEditing\Checkout\Cart\ShippingOffsetCartProcessor">
            <argument type="service" id="request_stack"/>
            <argument type="service" id="order.repository"/>
            <argument type="service" id="Shopware\Core\Checkout\Cart\Price\QuantityPriceCalculator"/>
            <argument type="service" id="SellopsLimitedOrderEditing\Service\FreeShippingDetectorService"/>
            <argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
            <tag name="shopware.cart.processor" priority="100"/>
        </service>

        <service id="SellopsLimitedOrderEditing\Storefront\Controller\OrderEditingController" public="true">
            <argument type="service" id="order.repository"/>
            <argument type="service" id="order_address.repository"/>
            <argument type="service" id="order_delivery.repository"/>
            <argument type="service" id="customer_address.repository"/>
            <argument type="service" id="Shopware\Core\System\SalesChannel\SalesChannel\ContextSwitchRoute"/>
            <argument type="service" id="Shopware\Core\Checkout\Cart\SalesChannel\CartService"/>
            <argument type="service" id="Shopware\Core\System\SalesChannel\Context\SalesChannelContextService"/>
            <argument type="service" id="sales_channel.product.repository"/>
            <argument type="service" id="product.repository"/>
            <argument type="service" id="property_group_option.repository"/>
            <argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
            <argument type="service" id="SellopsLimitedOrderEditing\Service\AllowedShippingCountriesProvider"/>
            <argument type="service" id="Shopware\Core\Checkout\Cart\Order\RecalculationService"/>
            <argument type="service" id="Shopware\Core\System\StateMachine\StateMachineRegistry"/>
            <argument type="service" id="logger"/>
            <argument type="service" id="SellopsLimitedOrderEditing\Service\OrderModificationTrackingService"/>
            <argument type="service" id="Shopware\Core\Checkout\Cart\Price\QuantityPriceCalculator"/>
            <argument type="service" id="Shopware\Core\Checkout\Payment\PaymentProcessor"/>
            <tag name="controller.service_arguments"/>
        </service>

        <service id="SellopsLimitedOrderEditing\ScheduledTask\UnfreezeOrdersTask">
            <tag name="shopware.scheduled.task"/>
        </service>

        <service id="SellopsLimitedOrderEditing\ScheduledTask\UnfreezeOrdersTaskHandler">
            <argument type="service" id="scheduled_task.repository"/>
            <argument type="service" id="logger"/>
            <argument type="service" id="order.repository"/>
            <argument type="service" id="Shopware\Core\System\StateMachine\StateMachineRegistry"/>
            <tag name="messenger.message_handler"/>
        </service>

        <!-- Order Modification Tracking entity -->
        <service id="SellopsLimitedOrderEditing\Entity\OrderModificationTracking\OrderModificationTrackingDefinition">
            <tag name="shopware.entity.definition"/>
        </service>

        <!-- Free shipping threshold detector -->
        <service id="SellopsLimitedOrderEditing\Service\FreeShippingDetectorService">
            <argument type="service" id="shipping_method.repository"/>
            <argument type="service" id="Shopware\Core\Checkout\Cart\Price\QuantityPriceCalculator"/>
            <argument type="service" id="logger"/>
        </service>

        <!-- Tracking service -->
        <service id="SellopsLimitedOrderEditing\Service\OrderModificationTrackingService">
            <argument type="service" id="sellops_order_modification_tracking.repository"/>
            <argument type="service" id="order.repository"/>
            <argument type="service" id="logger"/>
        </service>

        <!-- CLI command for backfilling tracking records -->
        <service id="SellopsLimitedOrderEditing\Command\FixPendingPaymentStatusCommand">
            <argument type="service" id="sellops_order_modification_tracking.repository"/>
            <argument type="service" id="order.repository"/>
            <tag name="console.command"/>
        </service>

        <service id="SellopsLimitedOrderEditing\Command\BackfillTrackingCommand">
            <argument type="service" id="order.repository"/>
            <argument type="service" id="sellops_order_modification_tracking.repository"/>
            <argument type="service" id="SellopsLimitedOrderEditing\Service\OrderModificationTrackingService"/>
            <tag name="console.command"/>
        </service>

        <!-- Subscriber that updates tracking payment status when a payment transaction is paid/authorized -->
        <service id="SellopsLimitedOrderEditing\Subscriber\OrderTransactionStateTrackingSubscriber">
            <argument type="service" id="SellopsLimitedOrderEditing\Service\OrderModificationTrackingService"/>
            <argument type="service" id="order_transaction.repository"/>
            <argument type="service" id="logger"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <!-- Subscriber that updates tracking records when order state changes -->
        <service id="SellopsLimitedOrderEditing\Subscriber\OrderStateChangeTrackingSubscriber">
            <argument type="service" id="SellopsLimitedOrderEditing\Service\OrderModificationTrackingService"/>
            <argument type="service" id="logger"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <!-- Subscriber that creates tracking records when child orders are placed -->
        <service id="SellopsLimitedOrderEditing\Subscriber\OrderModificationTrackingSubscriber">
            <argument type="service" id="SellopsLimitedOrderEditing\Service\OrderModificationTrackingService"/>
            <argument type="service" id="order.repository"/>
            <argument type="service" id="logger"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <!-- Intercepts outgoing order-confirmation mails for LOE supplement/replacement
             orders and replaces the default template with the combined parent+supplement view. -->
        <service id="SellopsLimitedOrderEditing\Subscriber\OrderConfirmationMailSubscriber">
            <argument type="service" id="order.repository"/>
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument type="service" id="logger"/>
            <tag name="kernel.event_subscriber"/>
        </service>
    </services>
</container>