<?xml version="1.0"?>
<!--
  ~ Copyright © 2020 CyberSource. All rights reserved.
  ~ See accompanying LICENSE.txt for applicable terms of use and license.
  -->
<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="CyberSourceGooglePayPaymentGatewayFacade" type="Magento\Payment\Model\Method\Adapter">
        <arguments>
            <argument name="code" xsi:type="const">CyberSource\GooglePay\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">CyberSourceGooglePayPaymentGatewayValueHandlerPool</argument>
            <argument name="commandPool" xsi:type="object">CyberSourceGooglePayPaymentGatewayCommandPool</argument>
        </arguments>
    </virtualType>

    <!-- Commands infrastructure -->
    <virtualType name="CyberSourceGooglePayPaymentGatewayCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="authorize" xsi:type="string">CyberSourceGooglePayGatewayAuthorizeCommand</item>
                <item name="capture" xsi:type="string">CyberSourceGooglePayCaptureStrategyCommand</item>
                <item name="sale" xsi:type="string">CyberSourceGooglePayGatewaySaleCommand</item>
                <item name="settlement" xsi:type="string">CyberSourceCoreGatewayRestSettlementCommand</item>
                <item name="void" xsi:type="string">CyberSourceCoreGatewayVoidCommand</item>
                <item name="cancel" xsi:type="string">CyberSourceCoreGatewayVoidCommand</item>
                <item name="refund" xsi:type="string">CyberSourceCoreGatewayRefundCommand</item>
            </argument>
        </arguments>
    </virtualType>
    
    <virtualType name="CyberSourceGooglePayGatewayAuthorizeCommand" type="CyberSourceCoreGatewayRestAuthorizeCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceGooglePayGatewayRestAuthorizationRequest</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceGooglePayGatewayRestAuthorizationRequest" type="CyberSourceCoreGatewayRestAuthorizationRequest">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="paymentSolutionGooglePay" xsi:type="string">CyberSourceGooglePayGatewayRequestRestPaymentSolutionBuilder</item>
                <item name="fluidDataBuilder" xsi:type="string">CyberSourceGooglePayGatewayRequestRestFluidDataBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceGooglePayGatewayRequestRestPaymentSolutionBuilder" type="CyberSource\Core\Gateway\Request\Rest\PaymentSolutionBuilder">
        <arguments>
            <argument name="paymentSolutionId" xsi:type="string">012</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceGooglePayGatewayRequestRestFluidDataBuilder" type="CyberSource\Core\Gateway\Request\Rest\FluidDataBuilder">
        <arguments>
            <argument name="additionalDataKey" xsi:type="const">CyberSource\GooglePay\Observer\DataAssignObserver::KEY_PAYMENT_TOKEN</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceGooglePayCaptureStrategyCommand" type="CyberSource\Core\Gateway\Command\CaptureStrategyCommand">
        <arguments>
            <argument name="commandPool" xsi:type="object">CyberSourceGooglePayPaymentGatewayCommandPool</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceGooglePayGatewaySaleCommand" type="CyberSourceGooglePayGatewayAuthorizeCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceGooglePayGatewayRestSaleRequest</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceGooglePayGatewayRestSaleRequest" type="CyberSourceGooglePayGatewayRestAuthorizationRequest">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="captureBuilder" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\CaptureBuilder</item>
            </argument>
        </arguments>
    </virtualType>

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

    <!-- Configuration reader -->
    <type name="CyberSource\GooglePay\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\GooglePay\Model\Ui\ConfigProvider::CODE</argument>
        </arguments>
    </type>

    <type name="CyberSource\GooglePay\Block\Button">
        <arguments>
            <argument name="configProvider" xsi:type="object">CyberSource\GooglePay\Model\Ui\ConfigProvider</argument>
            <argument name="shortcutTemplate" xsi:type="string">shortcut.phtml</argument>
            <argument name="method" xsi:type="object">CyberSourceGooglePayPaymentGatewayFacade</argument>
        </arguments>
    </type>

    <type name="CyberSource\Core\Plugin\MinificationPlugin">
        <arguments>
            <argument name="additionalExcludes" xsi:type="array">
                <item name="google-pay-api" xsi:type="string">pay.google.com</item>
            </argument>
        </arguments>
    </type>

</config>
