<?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="EwayApplePayFacade" type="Magento\Payment\Model\Method\Adapter">
        <arguments>
            <argument name="code" xsi:type="const">Eway\ApplePay\Model\Ui\ConfigProvider::APPLEPAY_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">EwayApplePayValueHandlerPool</argument>
            <argument name="commandPool" xsi:type="object">EwayRapidApplePayCommandPool</argument>
        </arguments>
    </virtualType>

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

    <!-- Commands infrastructure -->
    <virtualType name="EwayRapidApplePayCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="capture" xsi:type="string">EwayRapidApplePayCaptureCommand</item>
                <item name="authorize" xsi:type="string">EwayRapidApplePayAuthorizeCommand</item>
                <item name="sale" xsi:type="string">EwayRapidApplePayAuthorizeCommand</item>
                <item name="create_transaction" xsi:type="string">EwayRapidApplePayCreateTransactionCommand</item>
                <item name="query_transaction"  xsi:type="string">EwayRapidQueryTransactionByIdCommand</item>
                <item name="create_customer_token"  xsi:type="string">EwayRapidApplePayCreateCustomerTokenCommand</item>
                <item name="create_transaction_with_token"  xsi:type="string">EwayRapidApplePayCreateTransactionWithTokenCommand</item>
                <item name="multishipping_authorize"  xsi:type="string">EwayRapidApplePayMultiShippingAuthorizeCommand</item>
                <item name="create_multishipping_transaction"  xsi:type="string">EwayRapidApplePayCreateMultishippingTransactionCommand</item>
                <item name="query_multishipping_transaction"  xsi:type="string">EwayRapidQueryTransactionByIdMultishippingCommand</item>
                <item name="create_multishipping_transaction_with_token"  xsi:type="string">EwayRapidApplePayCreateMultishippingTransactionWithTokenCommand</item>
            </argument>
        </arguments>
    </virtualType>

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

    <!-- Authorize command -->
    <virtualType name="EwayRapidApplePayAuthorizeCommand" type="\Eway\ApplePay\Gateway\Command\AuthorizeCommand">
        <arguments>
            <argument name="commandPool" xsi:type="object">EwayRapidApplePayCommandPool</argument>
        </arguments>
    </virtualType>

    <!-- Multishipping Authorize Command -->
    <virtualType name="EwayRapidApplePayMultiShippingAuthorizeCommand" type="\Eway\ApplePay\Gateway\Command\MultishippingAuthorizeCommand">
        <arguments>
            <argument name="commandPool"    xsi:type="object">EwayRapidApplePayCommandPool</argument>
        </arguments>
    </virtualType>

    <!-- Create Multishipping Transaction Command -->
    <virtualType name="EwayRapidApplePayCreateMultishippingTransactionCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="client" xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder" xsi:type="object">EwayRapidApplePayMultishippingDataBuilder</argument>
            <argument name="transferFactory" xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator" xsi:type="object">\Eway\DirectConnection\Gateway\Validator\MultishippingResponseValidator</argument>
            <argument name="handler" xsi:type="object">EwayRapidApplePayMultishippingResponseHandler</argument>
        </arguments>
    </virtualType>

    <!-- Create Transaction Command -->
    <virtualType name="EwayRapidApplePayCreateTransactionCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidApplePayDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidDirectValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidApplePayResponseHandler</argument>
        </arguments>
    </virtualType>

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

    <!-- Create Customer Token Command -->
    <virtualType name="EwayRapidApplePayCreateCustomerTokenCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateCustomer</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidApplePayCreateTokenDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">Eway\EwayRapid\Gateway\Validator\CreateTokenValidator</argument>
            <argument name="handler"            xsi:type="object">Eway\EwayRapid\Gateway\Response\CreateTokenHandler</argument>
        </arguments>
    </virtualType>

    <!-- Create Multishipping Transaction With Token Command -->
    <virtualType name="EwayRapidApplePayCreateMultishippingTransactionWithTokenCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidApplePayMultishippingTokenRequestDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">Eway\DirectConnection\Gateway\Validator\MultishippingResponseValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidApplePayMultishippingResponseHandler</argument>
        </arguments>
    </virtualType>

    <!-- Create Transaction Builder -->
    <virtualType name="EwayRapidApplePayDataBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="payment_instrument" xsi:type="string">\Eway\ApplePay\Gateway\Request\PaymentInstrumentDataBuilder</item>
                <item name="method"             xsi:type="string">\Eway\ApplePay\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="base_request"       xsi:type="string">EwayRapidApplePayBaseRequestDataBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">Eway\Rapid\Enum\ApiMethod::WALLET</argument>
        </arguments>
    </virtualType>

    <!-- Create Transaction With Token Builder -->
    <virtualType name="EwayRapidApplePayTokenRequestDataBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <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>
                <item name="base_request"       xsi:type="string">EwayRapidApplePayTokenBaseRequestDataBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">Eway\Rapid\Enum\ApiMethod::WALLET</argument>
        </arguments>
    </virtualType>

    <!-- Create Customer Token Builder -->
    <virtualType name="EwayRapidApplePayCreateTokenDataBuilder" 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\ApplePay\Gateway\Request\PaymentInstrumentDataBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">Eway\Rapid\Enum\ApiMethod::WALLET</argument>
        </arguments>
    </virtualType>

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

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

    <!-- Multishipping Builder -->
    <virtualType name="EwayRapidApplePayMultishippingDataBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="payment_instrument" xsi:type="string">\Eway\ApplePay\Gateway\Request\PaymentInstrumentDataBuilder</item>
                <item name="method"             xsi:type="string">\Eway\ApplePay\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="base_request"       xsi:type="string">EwayRapidApplePayBaseRequestDataBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">Eway\Rapid\Enum\ApiMethod::WALLET</argument>
        </arguments>
    </virtualType>

    <!-- Create Multishipping Transaction With Token Builder -->
    <virtualType name="EwayRapidApplePayMultishippingTokenRequestDataBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <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>
                <item name="base_request"       xsi:type="string">EwayRapidApplePayTokenBaseRequestDataBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">Eway\Rapid\Enum\ApiMethod::WALLET</argument>
        </arguments>
    </virtualType>

    <!-- Response Handlers -->
    <virtualType name="EwayRapidApplePayResponseHandler" 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="EwayApplePayValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">EwayApplePayConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>

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

    <!-- Multishipping Response Handlers -->
    <virtualType name="EwayRapidApplePayMultishippingResponseHandler" 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>
</config>
