<?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="EwayGooglePayFacade" type="Eway\GooglePay\Model\Method\Adapter">
        <arguments>
            <argument name="code" xsi:type="const">Eway\GooglePay\Model\Ui\ConfigProvider::GOOGLEPAY_CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">\Eway\EwayRapid\Block\Info\Cc</argument>
            <argument name="valueHandlerPool" xsi:type="object">EwayGooglePayValueHandlerPool</argument>
            <argument name="commandPool" xsi:type="object">EwayRapidGooglePayCommandPool</argument>
<!--            <argument name="config" xsi:type="object">EwayRapidConfig</argument>-->
        </arguments>
    </virtualType>

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

    <!-- Commands infrastructure -->
    <virtualType name="EwayRapidGooglePayCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="capture" xsi:type="string">EwayRapidGooglePayCaptureCommand</item>
                <item name="authorize" xsi:type="string">EwayRapidGooglePayAuthorizeCommand</item>
                <item name="sale" xsi:type="string">EwayRapidGooglePayAuthorizeCommand</item>
                <item name="create_transaction" xsi:type="string">EwayRapidGooglePayCreateTransactionCommand</item>
                <item name="query_transaction"  xsi:type="string">EwayRapidQueryTransactionByIdCommand</item>
                <item name="create_customer_token"  xsi:type="string">EwayRapidGooglePayCreateCustomerTokenCommand</item>
                <item name="create_transaction_with_token"  xsi:type="string">EwayRapidGooglePayCreateTransactionWithTokenCommand</item>
                <item name="authorize_multishipping"  xsi:type="string">EwayRapidGooglePayAuthorizeMultiShippingCommand</item>
                <item name="create_transaction_multishipping" xsi:type="string">EwayRapidGooglePayCreateTransactionMultishippingCommand</item>
                <item name="query_transaction_multishipping"  xsi:type="string">EwayRapidQueryTransactionByIdMultishippingCommand</item>
                <item name="create_customer_token_multishipping"  xsi:type="string">EwayRapidGooglePayCreateCustomerTokenMultishippingCommand</item>
                <item name="create_transaction_with_token_multishipping"  xsi:type="string">EwayRapidGooglePayCreateTransactionWithTokenMultishippingCommand</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Capture command -->
    <virtualType name="EwayRapidGooglePayCaptureCommand" type="\Eway\EwayRapid\Gateway\Command\CaptureStrategyCommand">
        <arguments>
            <argument name="commandPool" xsi:type="object">EwayRapidGooglePayCommandPool</argument>
        </arguments>
    </virtualType>

    <!-- Authorize command -->
    <virtualType name="EwayRapidGooglePayAuthorizeCommand" type="\Eway\GooglePay\Gateway\Command\AuthorizeStrategyCommand">
        <arguments>
            <argument name="commandPool" xsi:type="object">EwayRapidGooglePayCommandPool</argument>
        </arguments>
    </virtualType>

    <virtualType name="EwayRapidGooglePayAuthorizeMultiShippingCommand" type="\Eway\GooglePay\Gateway\Command\AuthorizeStrategyMultishippingCommand">
        <arguments>
            <argument name="commandPool"    xsi:type="object">EwayRapidGooglePayCommandPool</argument>
            <argument name="config"         xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </virtualType>

    <!-- Create Customer Token Command -->
    <virtualType name="EwayRapidGooglePayCreateCustomerTokenCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateCustomer</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidGooglePayCreateTokenDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidCreateTokenValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidCreateTokenHandler</argument>
        </arguments>
    </virtualType>

    <!-- Create Customer Token Multishipping Command -->
    <virtualType name="EwayRapidGooglePayCreateCustomerTokenMultishippingCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateCustomer</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidGooglePayCreateTokenDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidCreateTokenValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidCreateTokenMultishippingResponseHandler</argument>
        </arguments>
    </virtualType>


    <!-- Create Transaction With Token Command -->
    <virtualType name="EwayRapidGooglePayCreateTransactionWithTokenCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidGooglePayWithTokenDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidDirectValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidGooglePayResponseHandler</argument>
        </arguments>
    </virtualType>

    <!-- Create Transaction With Token Command -->
    <virtualType name="EwayRapidGooglePayCreateTransactionWithTokenMultishippingCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidGooglePayWithTokenDataMultishippingBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidDirectMultishippingValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidGooglePayMultishippingResponseHandler</argument>
        </arguments>
    </virtualType>

    <!-- Create transaction command -->
    <virtualType name="EwayRapidGooglePayCreateTransactionCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidGooglePayDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidDirectValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidGooglePayResponseHandler</argument>
        </arguments>
    </virtualType>

    <virtualType name="EwayRapidGooglePayCreateTransactionMultishippingCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidGooglePayDataMultishippingBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidDirectMultishippingValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidGooglePayMultishippingResponseHandler</argument>
        </arguments>
    </virtualType>

    <!-- Request data builder -->
    <virtualType name="EwayRapidGooglePayDataBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders"           xsi:type="array">
                <item name="base_request"       xsi:type="string">EwayRapidGooglePayBaseRequestDataBuilder</item>
                <item name="payment_instrument" xsi:type="string">\Eway\GooglePay\Gateway\Request\PaymentInstrumentDataBuilder</item>
                <item name="method"             xsi:type="string">\Eway\GooglePay\Gateway\Request\MethodDataBuilder</item>
                <item name="customer"           xsi:type="string">\Eway\EwayRapid\Gateway\Request\CustomerDataBuilder</item>
                <item name="shipping_address"   xsi:type="string">\Eway\EwayRapid\Gateway\Request\ShippingAddressDataBuilder</item>
                <item name="items"              xsi:type="string">\Eway\EwayRapid\Gateway\Request\ItemsDataBuilder</item>
                <item name="payment"            xsi:type="string">\Eway\EwayRapid\Gateway\Request\PaymentDataBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">Eway\Rapid\Enum\ApiMethod::WALLET</argument>
        </arguments>
    </virtualType>

    <virtualType name="EwayRapidGooglePayDataMultishippingBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="base_request"       xsi:type="string">EwayRapidGooglePayBaseRequestDataBuilder</item>
                <item name="payment_instrument" xsi:type="string">\Eway\GooglePay\Gateway\Request\PaymentInstrumentDataBuilder</item>
                <item name="method"             xsi:type="string">\Eway\GooglePay\Gateway\Request\MethodDataBuilder</item>
                <item name="customer"           xsi:type="string">\Eway\EwayRapid\Gateway\Request\CustomerDataBuilder</item>
                <item name="shipping_address"   xsi:type="string">\Eway\EwayRapid\Gateway\Request\ShippingAddressDataBuilder</item>
                <item name="items"              xsi:type="string">\Eway\EwayRapid\Gateway\Request\MultishippingItemsDataBuilder</item>
                <item name="payment"            xsi:type="string">\Eway\EwayRapid\Gateway\Request\PaymentMultiShippingDataBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">Eway\Rapid\Enum\ApiMethod::WALLET</argument>
        </arguments>
    </virtualType>

    <virtualType name="EwayRapidGooglePayBaseRequestDataBuilder" type="Eway\EwayRapid\Gateway\Request\BaseRequestDataBuilder">
        <arguments>
            <argument name="config" xsi:type="object">Eway\GooglePay\Gateway\Config\Config</argument>
        </arguments>
    </virtualType>

    <virtualType name="EwayRapidGooglePayTokenBaseRequestDataBuilder" type="Eway\EwayRapid\Gateway\Request\BaseRequestDataBuilder">
        <arguments>
            <argument name="config" xsi:type="object">Eway\GooglePay\Gateway\Config\Config</argument>
            <argument name="transactionType" xsi:type="const">\Eway\EwayRapid\Model\Config::RECURRING</argument>
        </arguments>
    </virtualType>

    <!-- Create Customer Token Builder -->
    <virtualType name="EwayRapidGooglePayCreateTokenDataBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="customer"           xsi:type="string">\Eway\EwayRapid\Gateway\Request\CustomerTokenDataBuilder</item>
                <item name="payment_instrument" xsi:type="string">\Eway\GooglePay\Gateway\Request\PaymentInstrumentDataBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">Eway\Rapid\Enum\ApiMethod::WALLET</argument>
        </arguments>
    </virtualType>


    <!-- Create Transaction With Token Builder -->
    <virtualType name="EwayRapidGooglePayWithTokenDataBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="base_request"       xsi:type="string">EwayRapidGooglePayTokenBaseRequestDataBuilder</item>
                <item name="method"             xsi:type="string">\Eway\GooglePay\Gateway\Request\MethodDataBuilder</item>
                <item name="customer"           xsi:type="string">\Eway\EwayRapid\Gateway\Request\CustomerDataBuilder</item>
                <item name="shipping_address"   xsi:type="string">\Eway\EwayRapid\Gateway\Request\ShippingAddressDataBuilder</item>
                <item name="items"              xsi:type="string">\Eway\EwayRapid\Gateway\Request\ItemsDataBuilder</item>
                <item name="payment"            xsi:type="string">\Eway\EwayRapid\Gateway\Request\PaymentDataBuilder</item>
                <item name="customer_token"     xsi:type="string">\Eway\EwayRapid\Gateway\Request\TokenDataBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">Eway\Rapid\Enum\ApiMethod::WALLET</argument>
        </arguments>
    </virtualType>

    <!-- Create Transaction With Token Multishipping Builder -->
    <virtualType name="EwayRapidGooglePayWithTokenDataMultishippingBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="base_request"       xsi:type="string">EwayRapidGooglePayTokenBaseRequestDataBuilder</item>
                <item name="method"             xsi:type="string">\Eway\GooglePay\Gateway\Request\MethodDataBuilder</item>
                <item name="customer"           xsi:type="string">\Eway\EwayRapid\Gateway\Request\CustomerDataBuilder</item>
                <item name="shipping_address"   xsi:type="string">\Eway\EwayRapid\Gateway\Request\ShippingAddressDataBuilder</item>
                <item name="items"              xsi:type="string">\Eway\EwayRapid\Gateway\Request\MultishippingItemsDataBuilder</item>
                <item name="payment"            xsi:type="string">\Eway\EwayRapid\Gateway\Request\PaymentMultiShippingDataBuilder</item>
                <item name="customer_token"     xsi:type="string">\Eway\EwayRapid\Gateway\Request\TokenDataBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">Eway\Rapid\Enum\ApiMethod::WALLET</argument>
        </arguments>
    </virtualType>

    <!-- Response Handlers -->
    <virtualType name="EwayRapidGooglePayResponseHandler" type="Magento\Payment\Gateway\Response\HandlerChain">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="payment_details"    xsi:type="string">\Eway\EwayRapid\Gateway\Response\PaymentDetailsHandler</item>
                <item name="card_details"       xsi:type="string">\Eway\EwayRapid\Gateway\Response\CardDetailsHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="EwayRapidGooglePayMultishippingResponseHandler" type="Magento\Payment\Gateway\Response\HandlerChain">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="payment_details"    xsi:type="string">\Eway\EwayRapid\Gateway\Response\PaymentDetailsHandler</item>
                <item name="card_details"       xsi:type="string">\Eway\EwayRapid\Gateway\Response\CardDetailsHandler</item>
                <item name="response_storage"   xsi:type="string">\Eway\EwayRapid\Gateway\Response\Multishipping\CreateTransactionHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="EwayGooglePayValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">EwayGooglePayConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>

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