<?xml version="1.0"?>
<!--
/**
 * PHP version 7
* Copyright © Mobegic Inc. DBA Unbound Commerce.
 * All rights reserved.
 */
-->
<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="GooglePayFacade" type="Magento\Payment\Model\Method\Adapter">
        <arguments>
            <argument name="code" xsi:type="const">UnboundCommerce\GooglePay\Model\Ui\ConfigProvider::CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">UnboundCommerce\GooglePay\Block\Info</argument>
            <argument name="valueHandlerPool" xsi:type="object">GooglePayValueHandlerPool</argument>
            <argument name="commandPool" xsi:type="object">GooglePayCommandPool</argument>
        </arguments>
    </virtualType>

    <!-- Configuration reader -->
    <type name="UnboundCommerce\GooglePay\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">UnboundCommerce\GooglePay\Model\Ui\ConfigProvider::CODE</argument>
        </arguments>
    </type>

    <!-- Commands infrastructure -->
    <virtualType name="GooglePayCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="authorize" xsi:type="string">GooglePayAuthorizeCommand</item>
                <item name="sale" xsi:type="string">GooglePaySaleCommand</item>
                <item name="capture" xsi:type="string">GooglePayCaptureStrategyCommand</item>
                <item name="settlement" xsi:type="string">GooglePayCaptureCommand</item>
                <item name="void" xsi:type="string">GooglePayVoidCommand</item>
                <item name="cancel" xsi:type="string">GooglePayVoidCommand</item>
                <item name="refund" xsi:type="string">GooglePayRefundCommand</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Authorize command -->
    <virtualType name="GooglePayAuthorizeCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">GooglePayAuthorizeRequest</argument>
            <argument name="transferFactory" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Http\Client\ClientAuthorize</argument>
            <argument name="handler" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Response\AuthorizationHandler</argument>
            <argument name="validator" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Validator\ResponseValidator</argument>
        </arguments>
    </virtualType>

    <!-- Capture command -->
    <virtualType name="GooglePayCaptureCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">GooglePayRequest</argument>
            <argument name="transferFactory" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Http\Client\ClientCapture</argument>
            <argument name="handler" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Response\CaptureHandler</argument>
            <argument name="validator" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Validator\ResponseValidator</argument>
        </arguments>
    </virtualType>

    <!-- Capture strategy command -->
    <virtualType name="GooglePayCaptureStrategyCommand" type="UnboundCommerce\GooglePay\Gateway\Command\CaptureStrategyCommand">
        <arguments>
            <argument name="commandPool" xsi:type="object">GooglePayCommandPool</argument>
        </arguments>
    </virtualType>

    <!-- Sale command -->
    <virtualType name="GooglePaySaleCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">GooglePayAuthorizeRequest</argument>
            <argument name="transferFactory" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Http\Client\ClientSale</argument>
            <argument name="handler" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Response\SaleHandler</argument>
            <argument name="validator" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Validator\ResponseValidator</argument>
        </arguments>
    </virtualType>

    <!-- Void command -->
    <virtualType name="GooglePayVoidCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">GooglePayRequest</argument>
            <argument name="transferFactory" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Http\Client\ClientVoid</argument>
            <argument name="handler" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Response\CancelHandler</argument>
            <argument name="validator" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Validator\ResponseValidator</argument>
        </arguments>
    </virtualType>

    <!-- Refund command -->
    <virtualType name="GooglePayRefundCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">GooglePayRequest</argument>
            <argument name="transferFactory" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Http\Client\ClientRefund</argument>
            <argument name="handler" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Response\RefundHandler</argument>
            <argument name="validator" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Validator\ResponseValidator</argument>
        </arguments>
    </virtualType>

    <!-- Google Pay Authorize Request -->
    <virtualType name="GooglePayAuthorizeRequest" type="GooglePayRequest">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="additionalData" xsi:type="string">UnboundCommerce\GooglePay\Gateway\Request\AdditionalDataBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Google Pay Request -->
    <virtualType name="GooglePayRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="transaction" xsi:type="string">UnboundCommerce\GooglePay\Gateway\Request\PaymentDataBuilder</item>
                <item name="gatewayCredentials" xsi:type="string">UnboundCommerce\GooglePay\Gateway\Request\GatewayCredentialsBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Value handlers infrastructure -->
    <virtualType name="GooglePayValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">GooglePayConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="GooglePayConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Config\Config</argument>
        </arguments>
    </virtualType>

    <type name="UnboundCommerce\GooglePay\Block\Info">
        <arguments>
            <argument name="config" xsi:type="object">UnboundCommerce\GooglePay\Gateway\Config\Config</argument>
        </arguments>
    </type>

    <!-- Logger, initialized with GooglePayConfig -->
    <type name="UnboundCommerce\GooglePay\Logger\Handler\Cron">
        <arguments>
            <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
        </arguments>
    </type>
    <type name="UnboundCommerce\GooglePay\Logger\Handler\Debug">
        <arguments>
            <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
        </arguments>
    </type>
    <type name="UnboundCommerce\GooglePay\Logger\Handler\Error">
        <arguments>
            <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
        </arguments>
    </type>
    <type name="UnboundCommerce\GooglePay\Logger\Handler\Info">
        <arguments>
            <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
        </arguments>
    </type>
    <type name="UnboundCommerce\GooglePay\Logger\Handler\Webhook">
        <arguments>
            <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
        </arguments>
    </type>
    <type name="UnboundCommerce\GooglePay\Logger\Logger">
        <arguments>
            <argument name="name" xsi:type="string">gpayLogger</argument>
            <argument name="handlers" xsi:type="array">
                <item name="cron" xsi:type="object">UnboundCommerce\GooglePay\Logger\Handler\Cron</item>
                <item name="debug" xsi:type="object">UnboundCommerce\GooglePay\Logger\Handler\Debug</item>
                <item name="error" xsi:type="object">UnboundCommerce\GooglePay\Logger\Handler\Error</item>
                <item name="info" xsi:type="object">UnboundCommerce\GooglePay\Logger\Handler\Info</item>
                <item name="webhook" xsi:type="object">UnboundCommerce\GooglePay\Logger\Handler\Webhook</item>
            </argument>
        </arguments>
    </type>

    <!-- Preferences -->
    <preference for="UnboundCommerce\GooglePay\Api\GuestOrderManagementInterface" type="UnboundCommerce\GooglePay\Model\GuestOrderManagement" />
    <preference for="UnboundCommerce\GooglePay\Api\OrderManagementInterface" type="UnboundCommerce\GooglePay\Model\OrderManagement" />
    <preference for="UnboundCommerce\GooglePay\Api\GuestTransactionInformationManagementInterface" type="UnboundCommerce\GooglePay\Model\GuestTransactionInformationManagement" />
    <preference for="UnboundCommerce\GooglePay\Api\TransactionInformationManagementInterface" type="UnboundCommerce\GooglePay\Model\TransactionInformationManagement" />
    <preference for="UnboundCommerce\GooglePay\Api\Data\AddressInterface" type="UnboundCommerce\GooglePay\Model\Address" />
    <preference for="UnboundCommerce\GooglePay\Api\Data\CardInfoInterface" type="UnboundCommerce\GooglePay\Model\CardInfo" />
    <preference for="UnboundCommerce\GooglePay\Api\Data\IntermediatePaymentDataInterface" type="UnboundCommerce\GooglePay\Model\IntermediatePaymentData" />
    <preference for="UnboundCommerce\GooglePay\Api\Data\PaymentDataInterface" type="UnboundCommerce\GooglePay\Model\PaymentData" />
    <preference for="UnboundCommerce\GooglePay\Api\Data\PaymentMethodDataInterface" type="UnboundCommerce\GooglePay\Model\PaymentMethodData" />
    <preference for="UnboundCommerce\GooglePay\Api\Data\PaymentMethodTokenizationDataInterface" type="UnboundCommerce\GooglePay\Model\PaymentMethodTokenizationData" />
</config>
