<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

    <!-- Payment Method Facade configuration -->
    <virtualType name="CyberSourceKlarnaPaymentGatewayFacade" type="Magento\Payment\Model\Method\Adapter">
        <arguments>
            <argument name="code" xsi:type="const">CyberSource\KlarnaFinancial\Model\Ui\ConfigProvider::CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="valueHandlerPool" xsi:type="object">CyberSourceKlarnaPaymentGatewayValueHandlerPool</argument>
            <argument name="validatorPool" xsi:type="object">CyberSourceKlarnaPaymentGatewayValidatorPool</argument>
            <argument name="commandPool" xsi:type="object">CyberSourceKlarnaPaymentGatewayCommandPool</argument>
        </arguments>
    </virtualType>

    <!-- Configuration reader -->
    <type name="CyberSource\KlarnaFinancial\Gateway\Config\Config">
        <arguments>
            <argument name="pathPattern" xsi:type="const">Magento\Payment\Gateway\Config\Config::DEFAULT_PATH_PATTERN</argument>
            <argument name="methodCode" xsi:type="const">CyberSource\KlarnaFinancial\Model\Ui\ConfigProvider::CODE</argument>
        </arguments>
    </type>

    <!-- Commands infrastructure -->
    <virtualType name="CyberSourceKlarnaPaymentGatewayCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="authorize" xsi:type="string">CyberSourceKlarnaPaymentGatewayAuthorizeCommand</item>
                <item name="capture" xsi:type="string">CyberSourceKlarnaPaymentGatewayCaptureCommand</item>
                <item name="void" xsi:type="string">CyberSourceKlarnaPaymentGatewayVoidCommand</item>
                <item name="cancel" xsi:type="string">CyberSourceKlarnaPaymentGatewayVoidCommand</item>
                <item name="refund" xsi:type="string">CyberSourceKlarnaPaymentGatewayRefundCommand</item>
                <item name="check_status" xsi:type="string">CyberSourceKlarnaPaymentGatewayCheckStatusCommand</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="KlarnaPaymentCommandManager" type="Magento\Payment\Gateway\Command\CommandManager">
        <arguments>
            <argument name="commandPool" xsi:type="object">CyberSourceKlarnaPaymentGatewayCommandPool</argument>
        </arguments>
    </virtualType>

    <type name="Magento\Payment\Gateway\Command\CommandManagerPool">
        <arguments>
            <argument name="executors" xsi:type="array">
                <item name="cybersourceklarna" xsi:type="string">KlarnaPaymentCommandManager</item>
            </argument>
        </arguments>
    </type>

    <!-- Authorize command -->
    <virtualType name="CyberSourceKlarnaPaymentGatewayAuthorizeCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Request\AuthorizationRequest</argument>
            <argument name="handler" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Response\AuthorizeResponseHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Validator\ResponseCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Http\Client\SOAPClient</argument>
            <argument name="errorMessageMapper" xsi:type="object">CyberSource\Core\Gateway\ErrorMapper\ConfigurableMapper</argument>
        </arguments>
    </virtualType>

    <!-- Authorization Request -->
    <type name="CyberSource\KlarnaFinancial\Gateway\Request\AuthorizationRequest">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Config\Config</argument>
        </arguments>
    </type>

    <!-- Capture command -->
    <virtualType name="CyberSourceKlarnaPaymentGatewayCaptureCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Request\CaptureRequest</argument>
            <argument name="handler" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Response\CaptureResponseHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Validator\ResponseCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Http\Client\SOAPClient</argument>
            <argument name="errorMessageMapper" xsi:type="object">CyberSource\Core\Gateway\ErrorMapper\ConfigurableMapper</argument>
        </arguments>
    </virtualType>

    <!-- Capture Request -->
    <type name="CyberSource\KlarnaFinancial\Gateway\Request\CaptureRequest">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Config\Config</argument>
        </arguments>
    </type>

    <!-- Void command -->
    <virtualType name="CyberSourceKlarnaPaymentGatewayVoidCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Request\VoidRequest</argument>
            <argument name="handler" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Response\VoidResponseHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Validator\ResponseCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Http\Client\SOAPClient</argument>
        </arguments>
    </virtualType>

    <!-- Void Request -->
    <type name="CyberSource\KlarnaFinancial\Gateway\Request\VoidRequest">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Config\Config</argument>
        </arguments>
    </type>

    <!-- Refund command -->
    <virtualType name="CyberSourceKlarnaPaymentGatewayRefundCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Request\RefundRequest</argument>
            <argument name="handler" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Response\RefundResponseHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Validator\ResponseCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Http\Client\SOAPClient</argument>
        </arguments>
    </virtualType>

    <!-- Refund Request -->
    <type name="CyberSource\KlarnaFinancial\Gateway\Request\RefundRequest">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Config\Config</argument>
        </arguments>
    </type>

    <virtualType name="CyberSourceKlarnaPaymentGatewayCheckStatusCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Request\StatusRequestBuilder</argument>
            <argument name="handler" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Response\StatusResponseHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Validator\ResponseCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Http\Client\SOAPClient</argument>
        </arguments>
    </virtualType>

    <type name="CyberSource\KlarnaFinancial\Gateway\Response\StatusResponseHandler">
        <arguments>
            <argument name="stateCommand" xsi:type="object">Magento\Sales\Model\Order\Payment\State\AuthorizeCommand</argument>
        </arguments>
    </type>

    <!-- Value handlers infrastructure -->
    <virtualType name="CyberSourceKlarnaPaymentGatewayValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">CyberSourceKlarnaPaymentGatewayConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="CyberSourceKlarnaPaymentGatewayConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Config\Config</argument>
        </arguments>
    </virtualType>

    <!-- Klarna validators infrastructure -->
    <virtualType name="CyberSourceKlarnaPaymentGatewayCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\KlarnaFinancial\Gateway\Config\Config</argument>
        </arguments>
    </virtualType>
    <virtualType name="CyberSourceKlarnaPaymentGatewayValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">CyberSourceKlarnaPaymentGatewayCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <!-- END Klarna validators infrastructure -->
</config>
