<?xml version="1.0" encoding="UTF-8"?>

<!--

 This file is part of the Sylius package.

 (c) Sylius Sp. z o.o.

 For the full copyright and license information, please view the LICENSE
 file that was distributed with this source code.

-->

<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"
>
    <imports>
        <import resource="services/**/*.xml" />
    </imports>

    <parameters>
        <parameter key="sylius_paypal.prioritize_paypal_as_default_method">true</parameter>

        <parameter type="collection" key="sylius_paypal.repository.query.pay_pal_payment.updatable_states">
            <parameter type="constant">Sylius\Component\Payment\Model\PaymentInterface::STATE_CART</parameter>
            <parameter type="constant">Sylius\Component\Payment\Model\PaymentInterface::STATE_NEW</parameter>
        </parameter>
        <parameter type="collection" key="sylius_paypal.repository.query.pay_pal_payment.cancellable_states">
            <parameter type="constant">Sylius\Component\Payment\Model\PaymentInterface::STATE_CART</parameter>
            <parameter type="constant">Sylius\Component\Payment\Model\PaymentInterface::STATE_NEW</parameter>
            <parameter type="constant">Sylius\Component\Payment\Model\PaymentInterface::STATE_PROCESSING</parameter>
            <parameter type="constant">Sylius\Component\Payment\Model\PaymentInterface::STATE_AUTHORIZED</parameter>
        </parameter>
        <parameter type="collection" key="sylius_paypal.repository.query.pay_pal_payment.refundable_states">
            <parameter type="constant">Sylius\Component\Payment\Model\PaymentInterface::STATE_COMPLETED</parameter>
        </parameter>
    </parameters>

    <services>
        <service id="sylius_paypal.form.extension.payment_method" class="Sylius\PayPalPlugin\Form\Extension\PaymentMethodTypeExtension">
            <tag name="form.type_extension" />
        </service>

        <service id="sylius_paypal.form.type.paypal_configuration" class="Sylius\PayPalPlugin\Form\Type\PayPalConfigurationType">
            <argument>%sylius_paypal.sandbox%</argument>

            <tag name="form.type" />
            <tag name="sylius.gateway_configuration_type" type="sylius_paypal" label="sylius_paypal.label" />
        </service>

        <service id="sylius_paypal.form.type.paypal_sandbox_credentials" class="Sylius\PayPalPlugin\Form\Type\PayPalSandboxCredentialsType">
            <tag name="form.type" />
        </service>

        <service
            id="sylius_paypal.generator.paypal_auth_assertion"
            class="Sylius\PayPalPlugin\Generator\PayPalAuthAssertionGenerator"
        />
        <service id="Sylius\PayPalPlugin\Generator\PayPalAuthAssertionGeneratorInterface" alias="sylius_paypal.generator.paypal_auth_assertion" />

        <service id="sylius_paypal.api_platform.paypal_payment" class="Sylius\PayPalPlugin\ApiPlatform\PayPalPayment">
            <argument type="service" id="router" />
            <argument type="service" id="sylius_paypal.provider.available_countries" />
            <tag name="sylius.api.payment_method_handler" />
        </service>

        <service id="sylius_paypal.listener.paypal_payment_method" class="Sylius\PayPalPlugin\Listener\PayPalPaymentMethodListener">
            <argument type="service" id="sylius_paypal.onboarding.initiator" />
            <argument type="service" id="router" />
            <argument type="service" id="request_stack" />
            <argument type="service" id="sylius_paypal.provider.paypal_payment_method" />
            <argument>%sylius_paypal.sandbox%</argument>
            <tag name="kernel.event_listener" event="sylius.payment_method.initialize_create" method="initializeCreate" />
        </service>

        <service
            id="sylius_paypal.manager.payment_state"
            class="Sylius\PayPalPlugin\Manager\PaymentStateManager"
        >
            <argument type="service" id="sylius_abstraction.state_machine" />
            <argument type="service" id="sylius.manager.payment" />
            <argument type="service" id="sylius_paypal.processor.payment_complete" />
        </service>
        <service id="Sylius\PayPalPlugin\Manager\PaymentStateManagerInterface" alias="sylius_paypal.manager.payment_state" />

        <service id="sylius_paypal.factory.paypal_payment_method_new_resource" class="Sylius\PayPalPlugin\Factory\PayPalPaymentMethodNewResourceFactory" decorates="sylius.resource_controller.new_resource_factory">
            <argument type="service" id=".inner" />
            <argument type="service" id="sylius_paypal.onboarding.processor.basic" />
        </service>

        <service id="sylius_paypal.provider.order" class="Sylius\PayPalPlugin\Provider\OrderProvider">
            <argument type="service" id="sylius.repository.order" />
        </service>
        <service id="Sylius\PayPalPlugin\Provider\OrderProviderInterface" alias="sylius_paypal.provider.order" />

        <service
            id="sylius_paypal.provider.payment"
            class="Sylius\PayPalPlugin\Provider\PaymentProvider"
        >
            <argument type="service" id="sylius.repository.payment" />
            <argument type="service" id="sylius.repository.order" />
            <deprecated package="sylius/paypal-plugin" version="1.7">The "%service_id%" service is deprecated since 1.7 and will be removed in 3.0.</deprecated>
        </service>
        <service id="Sylius\PayPalPlugin\Provider\PaymentProviderInterface" alias="sylius_paypal.provider.payment" />

        <service
            id="sylius_paypal.provider.order_item_non_neutral_tax"
            class="Sylius\PayPalPlugin\Provider\OrderItemNonNeutralTaxesProvider"
        />
        <service id="Sylius\PayPalPlugin\Provider\OrderItemNonNeutralTaxProviderInterface" alias="sylius_paypal.provider.order_item_non_neutral_tax" />

        <service
            id="sylius_paypal.provider.paypal_item_data"
            class="Sylius\PayPalPlugin\Provider\PayPalItemDataProvider"
        >
            <argument type="service" id="sylius_paypal.provider.order_item_non_neutral_tax" />
        </service>
        <service id="Sylius\PayPalPlugin\Provider\PayPalItemDataProviderInterface" alias="sylius_paypal.provider.paypal_item_data" />

        <service
            id="sylius_paypal.provider.paypal_payment_method"
            class="Sylius\PayPalPlugin\Provider\PayPalPaymentMethodProvider"
        >
            <argument type="service" id="sylius.repository.payment_method" />
        </service>
        <service id="Sylius\PayPalPlugin\Provider\PayPalPaymentMethodProviderInterface" alias="sylius_paypal.provider.paypal_payment_method" />

        <service
            id="sylius_paypal.provider.paypal_refund_data"
            class="Sylius\PayPalPlugin\Provider\PayPalRefundDataProvider"
        >
            <argument type="service" id="sylius_paypal.api.cache_authorize_client" />
            <argument type="service" id="sylius_paypal.api.generic" />
            <argument type="service" id="sylius_paypal.provider.paypal_payment_method" />
        </service>
        <service id="Sylius\PayPalPlugin\Provider\PayPalRefundDataProviderInterface" alias="sylius_paypal.provider.paypal_refund_data" />

        <service
            id="sylius_paypal.provider.available_countries"
            class="Sylius\PayPalPlugin\Provider\AvailableCountriesProvider"
        >
            <argument type="service" id="sylius.repository.country" />
            <argument type="service" id="sylius.context.channel" />
        </service>
        <service id="Sylius\PayPalPlugin\Provider\AvailableCountriesProviderInterface" alias="sylius_paypal.provider.available_countries" />

        <service id="sylius_paypal.resolver.capture_payment" class="Sylius\PayPalPlugin\Resolver\CapturePaymentResolver">
            <argument type="service" id="payum" />
        </service>
        <service id="Sylius\PayPalPlugin\Resolver\CapturePaymentResolverInterface" alias="sylius_paypal.resolver.capture_payment" />

        <service
            id="sylius_paypal.order_processing.order_payment_processor.after_checkout"
            class="Sylius\PayPalPlugin\Processor\AfterCheckoutOrderPaymentProcessor"
            decorates="sylius.order_processing.order_payment_processor.after_checkout"
        >
            <argument type="service" id=".inner" />
        </service>

        <service
            id="sylius_paypal.order_processing.order_payment_processor.checkout"
            class="Sylius\PayPalPlugin\Processor\OrderPaymentProcessor"
            decorates="sylius.order_processing.order_payment_processor.checkout"
        >
            <argument type="service" id=".inner" />
            <argument type="service" id="sylius_abstraction.state_machine" />
        </service>

        <service id="sylius_paypal.processor.paypal_order_complete" class="Sylius\PayPalPlugin\Processor\PayPalOrderCompleteProcessor" public="true">
            <argument type="service" id="sylius_paypal.manager.payment_state" />
            <argument type="service" id="sylius_paypal.verifier.payment_amount" />
        </service>

        <service
            id="sylius_paypal.processor.payment_complete"
            class="Sylius\PayPalPlugin\Processor\PayPalPaymentCompleteProcessor"
        >
            <argument type="service" id="payum" />
        </service>
        <service id="Sylius\PayPalPlugin\Processor\PaymentCompleteProcessorInterface" alias="sylius_paypal.processor.payment_complete" />

        <service
            id="sylius_paypal.processor.locale"
            class="Sylius\PayPalPlugin\Processor\LocaleProcessor"
        >
            <argument type="service" id="sylius_paypal.resolver.supported_locale" />
        </service>
        <service id="Sylius\PayPalPlugin\Processor\LocaleProcessorInterface" alias="sylius_paypal.processor.locale" />

        <service
            id="sylius_paypal.processor.payment_refund"
            class="Sylius\PayPalPlugin\Processor\PayPalPaymentRefundProcessor"
            public="true"
        >
            <argument type="service" id="sylius_paypal.api.cache_authorize_client" />
            <argument type="service" id="sylius_paypal.api.order_details" />
            <argument type="service" id="sylius_paypal.api.refund_payment" />
            <argument type="service" id="sylius_paypal.generator.paypal_auth_assertion" />
            <argument type="service" id="sylius_paypal.provider.refund_reference_number" />
        </service>
        <service id="Sylius\PayPalPlugin\Processor\PaymentRefundProcessorInterface" alias="sylius_paypal.processor.payment_refund" />

        <service
            id="sylius_paypal.processor.ui_paypal_payment_refund"
            class="Sylius\PayPalPlugin\Processor\UiPayPalPaymentRefundProcessor"
            decorates="sylius_paypal.processor.payment_refund"
        >
            <argument type="service" id=".inner" />
        </service>

        <service
            id="sylius_paypal.resolver.payment_method.paypal"
            class="Sylius\PayPalPlugin\Resolver\PayPalDefaultPaymentMethodResolver"
            decorates="sylius.resolver.payment_method.default"
        >
            <argument type="service" id=".inner" />
            <argument type="service" id="sylius.repository.payment_method" />
            <argument>%sylius_paypal.prioritize_paypal_as_default_method%</argument>
        </service>

        <service
            id="sylius_paypal.resolver.payment_method.paypal_prioritising"
            class="Sylius\PayPalPlugin\Resolver\PayPalPrioritisingPaymentMethodsResolver"
            decorates="sylius.resolver.payment_methods"
        >
            <argument type="service" id=".inner" />
            <argument>%sylius_paypal.prioritized_factory_name%</argument>
        </service>

        <service
            id="sylius_paypal.provider.paypal_configuration"
            class="Sylius\PayPalPlugin\Provider\PayPalConfigurationProvider"
        >
            <argument type="service" id="sylius.repository.payment_method" />
        </service>
        <service id="Sylius\PayPalPlugin\Provider\PayPalConfigurationProviderInterface" alias="sylius_paypal.provider.paypal_configuration" />

        <service
            id="sylius_paypal.provider.uuid"
            class="Sylius\PayPalPlugin\Provider\UuidProvider"
        />
        <service id="Sylius\PayPalPlugin\Provider\UuidProviderInterface" alias="sylius_paypal.provider.uuid" />

        <service id="sylius_paypal.client.sftp" class="phpseclib3\Net\SFTP">
            <argument>%sylius_paypal.reports_sftp_host%</argument>
        </service>

        <service
            id="sylius_paypal.downloader.report"
            class="Sylius\PayPalPlugin\Downloader\SftpPayoutsReportDownloader"
        >
            <argument type="service" id="sylius_paypal.client.sftp" />
        </service>
        <service id="Sylius\PayPalPlugin\Downloader\ReportDownloaderInterface" alias="sylius_paypal.downloader.report" />

        <service id="sylius_paypal.processor.paypal_address" class="Sylius\PayPalPlugin\Processor\PayPalAddressProcessor">
            <argument type="service" id="doctrine.orm.entity_manager" />
            <deprecated package="sylius/paypal-plugin" version="1.7">The "%service_id%" service is deprecated since 1.7 and will be removed in 3.0.</deprecated>
        </service>

        <service
            id="sylius_paypal.updater.payment"
            class="Sylius\PayPalPlugin\Updater\PayPalPaymentUpdater"
        >
            <argument type="service" id="sylius.manager.payment" />
        </service>
        <service id="Sylius\PayPalPlugin\Updater\PaymentUpdaterInterface" alias="sylius_paypal.updater.payment" />

        <service
            id="sylius_paypal.enabler.payment_method"
            class="Sylius\PayPalPlugin\Enabler\PayPalPaymentMethodEnabler"
        >
            <argument type="service" id="sylius.http_client" />
            <argument>%sylius_paypal.facilitator_url%</argument>
            <argument type="service" id="sylius.manager.payment_method" />
            <argument type="service" id="sylius_paypal.registrar.seller_webhook" />
            <argument type="service" id="Psr\Http\Message\RequestFactoryInterface" />
        </service>
        <service id="Sylius\PayPalPlugin\Enabler\PaymentMethodEnablerInterface" alias="sylius_paypal.enabler.payment_method" />

        <service
            id="sylius_paypal.provider.payment_reference_number"
            class="Sylius\PayPalPlugin\Provider\PaymentReferenceNumberProvider"
        />
        <service id="Sylius\PayPalPlugin\Provider\PaymentReferenceNumberProviderInterface" alias="sylius_paypal.provider.payment_reference_number" />

        <service id="sylius_paypal.console.command.complete_paid_payments" class="Sylius\PayPalPlugin\Console\Command\CompletePaidPaymentsCommand">
            <argument type="service" id="sylius.repository.payment" />
            <argument type="service" id="sylius.manager.payment" />
            <argument type="service" id="sylius_paypal.api.cache_authorize_client" />
            <argument type="service" id="sylius_paypal.api.order_details" />
            <argument type="service" id="sylius_abstraction.state_machine" />
            <tag name="console.command" />
        </service>

        <service
            id="sylius_paypal.provider.refund_reference_number"
            class="Sylius\PayPalPlugin\Provider\RefundReferenceNumberProvider"
        />
        <service id="Sylius\PayPalPlugin\Provider\RefundReferenceNumberProviderInterface" alias="sylius_paypal.provider.refund_reference_number" />

        <service
            id="sylius_paypal.registrar.seller_webhook"
            class="Sylius\PayPalPlugin\Registrar\SellerWebhookRegistrar"
        >
            <argument type="service" id="sylius_paypal.api.authorize_client" />
            <argument type="service" id="router" />
            <argument type="service" id="sylius_paypal.api.webhook" />
        </service>
        <service id="Sylius\PayPalPlugin\Registrar\SellerWebhookRegistrarInterface" alias="sylius_paypal.registrar.seller_webhook" />

        <service id="sylius_paypal.creator.sandbox_payment_method" class="Sylius\PayPalPlugin\Creator\PayPalSandboxPaymentMethodCreator">
            <argument type="service" id="sylius.factory.gateway_config" />
            <argument type="service" id="sylius.factory.payment_method" />
            <argument type="service" id="doctrine.orm.entity_manager" />
        </service>

        <service id="sylius_paypal.twig.extension.paypal" class="Sylius\PayPalPlugin\Twig\PayPalExtension">
            <argument>%sylius_paypal.sandbox%</argument>
            <tag name="twig.extension" />
        </service>

        <service id="sylius_paypal.twig.extension.order_address" class="Sylius\PayPalPlugin\Twig\OrderAddressExtension">
            <tag name="twig.extension" />
        </service>

        <service
                id="sylius_paypal.twig.component.paypal_sandbox_modal"
                class="Sylius\PayPalPlugin\Twig\Component\PayPalSandboxModalComponent"
        >
            <argument type="service" id="form.factory" />
            <argument type="service" id="sylius_paypal.creator.sandbox_payment_method" />
            <argument type="service" id="request_stack" />
            <argument type="service" id="logger" />
            <argument type="service" id="router" />

            <tag
                    name="sylius.live_component.admin"
                    key="sylius_paypal:create_sandbox_modal"
                    template="@SyliusPayPalPlugin/admin/shared/components/paypal_sandbox_modal.html.twig"
            />
        </service>

        <service id="sylius_paypal.verifier.payment_amount" class="Sylius\PayPalPlugin\Verifier\PaymentAmountVerifier" />
        <service id="Sylius\PayPalPlugin\Verifier\PaymentAmountVerifierInterface" alias="sylius_paypal.verifier.payment_amount" />

        <service
            id="sylius_paypal.repository.query.paypal_payment"
            class="Sylius\PayPalPlugin\Repository\Query\PaypalPaymentQuery"
        >
            <argument type="service" id="sylius.manager.payment" />
            <argument type="service" id="sylius.repository.payment"/>
            <argument>%sylius_paypal.repository.query.pay_pal_payment.updatable_states%</argument>
            <argument>%sylius_paypal.repository.query.pay_pal_payment.cancellable_states%</argument>
            <argument>%sylius_paypal.repository.query.pay_pal_payment.refundable_states%</argument>
        </service>
        <service id="Sylius\PayPalPlugin\Repository\Query\PaypalPaymentQueryInterface" alias="sylius_paypal.repository.query.paypal_payment" />

        <service id="sylius_paypal.resolver.paypal_payment_methods" class="Sylius\PayPalPlugin\Resolver\PayPalPaymentMethodsResolver">
            <argument type="service" id="sylius.repository.payment_method" />
        </service>
        <service id="Sylius\PayPalPlugin\Resolver\PayPalPaymentMethodsResolverInterface" alias="sylius_paypal.resolver.paypal_payment_methods" />

        <service
            id="sylius_paypal.resolver.supported_locale"
            class="Sylius\PayPalPlugin\Resolver\SupportedLocaleResolver"
        >
            <argument>%sylius_paypal.supported_locales%</argument>
        </service>
        <service id="Sylius\PayPalPlugin\Resolver\SupportedLocaleResolverInterface" alias="sylius_paypal.resolver.supported_locale" />
    </services>
</container>
