<?xml version="1.0"?>
<!--
/**
 * Copyright © 2018 CyberSource. All rights reserved.
 * See LICENSE.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <!-- Configuration reader -->
    <type name="CyberSource\PayPal\Model\Config">
        <arguments>
            <argument name="pathPattern" xsi:type="const">Magento\Payment\Gateway\Config\Config::DEFAULT_PATH_PATTERN</argument>
            <argument name="methodCode" xsi:type="const">CyberSource\PayPal\Model\Config::CODE</argument>
        </arguments>
    </type>

    <type name="CyberSource\PayPal\Block\Express\Shortcut">
        <arguments>
            <argument name="paymentMethodCode" xsi:type="const">CyberSource\PayPal\Model\Config::CODE</argument>
            <argument name="startAction" xsi:type="string">cybersourcepaypal/express/start/button/1</argument>
            <argument name="checkoutType" xsi:type="string">Magento\Paypal\Model\Express\Checkout</argument>
            <argument name="alias" xsi:type="string">product.info.addtocart.paypal</argument>
            <argument name="shortcutTemplate" xsi:type="string">express/shortcut.phtml</argument>
            <argument name="shortcutValidator" xsi:type="object">CyberSource\PayPal\Helper\Shortcut\Validator</argument>
        </arguments>
    </type>

    <type name="CyberSource\PayPal\Block\Bml\Shortcut">
        <arguments>
            <argument name="paymentMethodCode" xsi:type="const">CyberSource\PayPal\Model\Config::CODE</argument>
            <argument name="startAction" xsi:type="string">cybersourcepaypal/bml/start/button/1</argument>
            <argument name="bmlMethodCode" xsi:type="const">CyberSource\PayPal\Model\Config::CODE_CREDIT</argument>
            <argument name="alias" xsi:type="string">product.info.addtocart.paypalbml</argument>
            <argument name="shortcutTemplate" xsi:type="string">express/shortcut.phtml</argument>
            <argument name="shortcutValidator" xsi:type="object">CyberSource\PayPal\Helper\Shortcut\Validator</argument>
        </arguments>
    </type>

    <type name="CyberSource\PayPal\Block\Express\InContext\Minicart\Button">
        <arguments>
            <argument name="data" xsi:type="array">
                <item name="template" xsi:type="string">CyberSource_PayPal::express/in-context/shortcut/button.phtml</item>
                <item name="alias" xsi:type="string">paypal.express-in-context.mini-cart</item>
                <item name="button_id" xsi:type="string">paypal-express-in-context-mini-cart</item>
                <item name="link_data_action" xsi:type="string">paypal-in-context-checkout</item>
            </argument>
            <argument name="payment" xsi:type="object">CyberSource\PayPal\Model\Payment</argument>
        </arguments>
    </type>
    
    <type name="CyberSource\Core\Helper\Data">
        <arguments>
            <argument name="additionalInfoKeys" xsi:type="array">
                <item name="paypal_customer_email" xsi:type="const">CyberSource\PayPal\Model\Express\Checkout::PAYMENT_INFO_TRANSPORT_PAYER_EMAIL</item>
            </argument>
        </arguments>
    </type>
    
    <!-- Vault payment -->
    
    <!-- Vault sale command -->
    <virtualType name="CyberSourcePayPalVaultSaleCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSource\PayPal\Gateway\Request\VaultSaleRequestBuilder</argument>
            <argument name="handler" xsi:type="object">CyberSource\PayPal\Gateway\Response\VaultResponseHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\PayPal\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\PayPal\Gateway\Validator\VaultReasonCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\PayPal\Gateway\Http\Client\SOAPClient</argument>
            <argument name="errorMessageMapper" xsi:type="object">CyberSource\Core\Gateway\ErrorMapper\ConfigurableMapper</argument>
        </arguments>
    </virtualType>

    <!-- Commands infrastructure -->
    <virtualType name="CyberSourcePayPalCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="vault_sale" xsi:type="string">CyberSourcePayPalVaultSaleCommand</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Vault payment facade -->
    <virtualType name="CyberSourcePayPalVaultFacade" type="Magento\Vault\Model\Method\Vault">
        <arguments>
            <argument name="config" xsi:type="object">CyberSourcePayPalVaultPaymentConfig</argument>
            <argument name="valueHandlerPool" xsi:type="object">CyberSourcePayPalValueHandlerPool</argument>
            <argument name="vaultProvider" xsi:type="object">CyberSource\PayPal\Model\Payment</argument>
            <argument name="code" xsi:type="const">CyberSource\PayPal\Model\Config::CODE_VAULT</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourcePayPalValueHandlerPool" type="VaultPaymentValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">CyberSourcePayPalVaultPaymentValueHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourcePayPalVaultPaymentConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">CyberSource\PayPal\Model\Config::CODE_VAULT</argument>
        </arguments>
    </virtualType>
    <virtualType name="CyberSourcePayPalVaultPaymentValueHandler" type="VaultPaymentDefaultValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">CyberSourcePayPalVaultPaymentConfig</argument>
        </arguments>
    </virtualType>

    <!-- Vault command manager -->
    <virtualType name="CyberSourcePayPalCommandManager" type="Magento\Payment\Gateway\Command\CommandManager">
        <arguments>
            <argument name="commandPool" xsi:type="object">CyberSourcePayPalCommandPool</argument>
        </arguments>
    </virtualType>
    <type name="Magento\Payment\Gateway\Command\CommandManagerPool">
        <arguments>
            <argument name="executors" xsi:type="array">
                <item name="cybersourcepaypal" xsi:type="string">CyberSourcePayPalCommandManager</item>
            </argument>
        </arguments>
    </type>

    <type name="Magento\Vault\Model\Method\Vault">
        <plugin name="cybersource-paypal-vault-plugin" type="CyberSource\PayPal\Plugin\Vault\Model\Method\VaultPlugin"/>
    </type>

    <type name="CyberSource\Core\Cron\DecisionManagerReport">
        <arguments>
            <argument name="transactionProcessors" xsi:type="array">
                <item name="cybersourcepaypal" xsi:type="object">CyberSource\PayPal\Model\DmProcessor</item>
            </argument>
        </arguments>
    </type>

    <type name="CyberSource\PayPal\Model\DmProcessor">
        <arguments>
            <argument name="saleRequestBuilder" xsi:type="object">CyberSourcePayPalGatewayRequestSaleBuilder</argument>
        </arguments>
    </type>

    <virtualType name="CyberSourcePayPalGatewayRequestSaleBuilder" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="merchantData" xsi:type="string">CyberSourcePayPalGatewayRequestMerchantDataBuilder</item>
                <item name="apPaymentType" xsi:type="string">CyberSourcePayPalGatewayRequestPaymentTypeBuilder</item>
                <item name="mrnBuilder" xsi:type="string">CyberSource\Core\Gateway\Request\Soap\OrderMrnBuilder</item>
                <item name="paymentData" xsi:type="string">\CyberSource\Core\Gateway\Request\Soap\PaymentDataBuilder</item>
                <item name="billTo" xsi:type="string">CyberSource\Core\Gateway\Request\Soap\BillToBuilder</item>
                <item name="shipTo" xsi:type="string">CyberSource\Core\Gateway\Request\Soap\ShipToBuilder</item>
                <item name="apSaleRequest" xsi:type="string">CyberSourcePayPalGatewayRequestSaleApBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourcePayPalGatewayRequestPaymentTypeBuilder" type="CyberSource\Core\Gateway\Request\Soap\PaymentTypeBuilder">
        <arguments>
            <argument name="paymentCode" xsi:type="const">CyberSource\PayPal\Helper\RequestDataBuilder::AP_PAYMENT_TYPE</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourcePayPalGatewayRequestMerchantDataBuilder" type="CyberSource\Core\Gateway\Request\Soap\MerchantDataBuilder">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\Core\Model\Config</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourcePayPalGatewayRequestSaleApBuilder" type="CyberSource\Core\Gateway\Request\Soap\ServiceRunBuilder">
        <arguments>
            <argument name="serviceName" xsi:type="string">apSaleService</argument>
            <argument name="builders" xsi:type="array">
                <item name="orderRequestId" xsi:type="string">CyberSource\PayPal\Gateway\Request\Soap\OrderRequestIdBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <!--<type name="Magento\Vault\Controller\Cards\DeleteAction">
        <plugin name="cybersource-paypal-vault-token-delete-plugin" type="CyberSource\PayPal\Plugin\Controller\Cards\DeleteTokenPlugin"/>
    </type>-->

</config>
