<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <!-- ###############################################################################################-->
    <!-- ################                        SECURE FIELDS                          ################-->
    <!-- ###############################################################################################-->

    <!-- Add Secure Fields method to the Adapter -->
    <virtualType name="EwayRapidMethodAdapter">
        <arguments>
            <argument name="methodInstances" xsi:type="array">
                <item name="securefields" xsi:type="string">EwayRapidSecureFieldsFacade</item>
            </argument>
        </arguments>
    </virtualType>
    <type name="Eway\EwayRapid\Model\Ui\ConfigProvider">
        <arguments>
            <argument name="methodSpecificConfig" xsi:type="array">
                <item name="securefields" xsi:type="object">\Eway\SecureFields\Model\Ui\Config</item>
            </argument>
        </arguments>
    </type>
    <type name="\Eway\SecureFields\Model\Ui\Config">
        <arguments>
            <argument name="config"         xsi:type="object">EwayRapidConfig</argument>
            <argument name="commandPool"    xsi:type="object">EwayRapidSecureFieldsCommandPool</argument>
        </arguments>
    </type>

    <virtualType name="EwayRapidSecureFieldsFacade" type="\Eway\SecureFields\Model\Method\Adapter">
        <arguments>
            <argument name="code"               xsi:type="const">\Eway\EwayRapid\Model\Ui\ConfigProvider::CODE</argument>
            <argument name="formBlockType"      xsi:type="string">EwayRapidSecureFieldsFormBlock</argument>
            <argument name="infoBlockType"      xsi:type="string">\Eway\EwayRapid\Block\Info\Cc</argument>
            <argument name="valueHandlerPool"   xsi:type="object">EwayRapidDefaultValueHandlerPool</argument>
            <argument name="validatorPool"      xsi:type="object">EwayRapidValidatorPool</argument>
            <argument name="commandPool"        xsi:type="object">EwayRapidSecureFieldsCommandPool</argument>
            <argument name="config"             xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </virtualType>

    <!-- Command Pool -->
    <virtualType name="EwayRapidSecureFieldsCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="authorize"          xsi:type="string">EwayRapidSecureFieldsAuthorizeStrategyCommand</item>
                <item name="sale"               xsi:type="string">EwayRapidSecureFieldsAuthorizeStrategyCommand</item>
                <item name="capture"            xsi:type="string">EwayRapidSecureFieldsCaptureStrategyCommand</item>
                <item name="pre_auth_capture"   xsi:type="string">EwayRapidPreAuthCaptureCommand</item>
                <item name="non_token_authorize" xsi:type="string">EwayRapidSecureFieldsAuthorizeCommand</item>
                <item name="create_token"       xsi:type="string">EwayRapidSecureFieldsCreateTokenCommand</item>
                <item name="update_token"       xsi:type="string">EwayRapidSecureFieldsUpdateTokenCommand</item>
                <item name="charge_token"       xsi:type="string">EwayRapidSecureFieldsChargeTokenCommand</item>
                <item name="charge_token_moto"  xsi:type="string">EwayRapidSecureFieldsChargeTokenMOTOCommand</item>
                <item name="void"               xsi:type="string">EwayRapidCancelTransactionCommand</item>
                <item name="cancel"             xsi:type="string">EwayRapidCancelTransactionCommand</item>
                <item name="refund"             xsi:type="string">EwayRapidRefundTransactionCommand</item>
                <item name="query_transaction"  xsi:type="string">EwayRapidQueryTransactionByIdCommand</item>
                <item name="authorize_multishipping"    xsi:type="string">EwayRapidSecureFieldsAuthorizeStrategyMultishippingCommand</item>
                <item name="create_token_multishipping" xsi:type="string">EwayRapidSecureFieldsCreateTokenMultiShippingCommand</item>
                <item name="update_token_multishipping" xsi:type="string">EwayRapidSecureFieldsUpdateTokenCommand</item>
                <item name="non_token_authorize_multishipping" xsi:type="string">EwayRapidSecureFieldsAuthorizeMultiShippingCommand</item>
                <item name="charge_token_multishipping"       xsi:type="string">EwayRapidSecureFieldsChargeTokenMultiShippingCommand</item>
                <item name="charge_token_moto_multishipping"  xsi:type="string">EwayRapidSecureFieldsChargeTokenMOTOMultishippingCommand</item>
                <item name="query_transaction_multishipping"  xsi:type="string">EwayRapidQueryTransactionByIdMultishippingCommand</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsAuthorizeCommand" type="\Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidSecureFieldsDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidDirectValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidDirectResponseHandler</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsAuthorizeMultiShippingCommand" type="\Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidSecureFieldsDataMultiShippingBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidDirectMultishippingValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidDirectResponseHandler</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsCaptureStrategyCommand" type="\Eway\EwayRapid\Gateway\Command\CaptureStrategyCommand">
        <arguments>
            <argument name="commandPool" xsi:type="object">EwayRapidSecureFieldsCommandPool</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsAuthorizeStrategyCommand" type="\Eway\DirectConnection\Gateway\Command\AuthorizeStrategyCommand">
        <arguments>
            <argument name="commandPool"    xsi:type="object">EwayRapidSecureFieldsCommandPool</argument>
            <argument name="config"         xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsAuthorizeStrategyMultishippingCommand" type="\Eway\DirectConnection\Gateway\Command\AuthorizeStrategyMultishippingCommand">
        <arguments>
            <argument name="commandPool"    xsi:type="object">EwayRapidSecureFieldsCommandPool</argument>
            <argument name="config"         xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </virtualType>

    <virtualType name="EwayRapidSecureFieldsCreateTokenCommand" type="\Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateCustomer</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidSecureFieldsCreateTokenDataBuilder</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>
    <virtualType name="EwayRapidSecureFieldsCreateTokenMultiShippingCommand" type="\Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateCustomer</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidSecureFieldsCreateTokenDataBuilder</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>

    <virtualType name="EwayRapidSecureFieldsUpdateTokenCommand" type="\Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientUpdateCustomer</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidSecureFieldsCreateTokenDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidCreateTokenValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidUpdateTokenHandler</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsChargeTokenCommand" type="\Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidSecureFieldsTokenDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidDirectValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidDirectResponseHandler</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsChargeTokenMultiShippingCommand" type="\Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidSecureFieldsTokenDataMultiShippingBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidDirectMultishippingValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidDirectMultishippingResponseHandler</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsChargeTokenMOTOCommand" type="\Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidSecureFieldsTokenMOTODataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidDirectValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidDirectResponseHandler</argument>
        </arguments>
    </virtualType>

    <virtualType name="EwayRapidSecureFieldsChargeTokenMOTOMultishippingCommand" type="\Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidSecureFieldsTokenMOTODataMultishippingBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidDirectMultishippingValidator</argument>
            <argument name="handler"            xsi:type="object">EwayRapidDirectMultishippingResponseHandler</argument>
        </arguments>
    </virtualType>

    <!-- Request Builder -->
    <virtualType name="EwayRapidSecureFieldsDataBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="base_request"       xsi:type="string">\Eway\EwayRapid\Gateway\Request\BaseRequestDataBuilder</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="secured_card_data"  xsi:type="string">\Eway\SecureFields\Gateway\Request\SecuredCardDataBuilder</item>
                <item name="three_d_secure_auth" xsi:type="string">\Eway\DirectConnection\Gateway\Request\ThreeDSecureAuthBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">\Eway\Rapid\Enum\ApiMethod::DIRECT</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsDataMultiShippingBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="base_request"       xsi:type="string">\Eway\EwayRapid\Gateway\Request\BaseRequestDataBuilder</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="secured_card_data"  xsi:type="string">\Eway\SecureFields\Gateway\Request\SecuredCardDataBuilder</item>
                <item name="three_d_secure_auth" xsi:type="string">\Eway\DirectConnection\Gateway\Request\ThreeDSecureAuthBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">\Eway\Rapid\Enum\ApiMethod::DIRECT</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsTokenDataMultiShippingBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="base_request"       xsi:type="string">\Eway\EwayRapid\Gateway\Request\BaseRequestDataBuilder</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>
                <item name="secured_card_data"  xsi:type="string">\Eway\SecureFields\Gateway\Request\SecuredCardDataBuilder</item>
                <item name="three_d_secure_auth" xsi:type="string">\Eway\DirectConnection\Gateway\Request\ThreeDSecureAuthBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">\Eway\Rapid\Enum\ApiMethod::DIRECT</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsCreateTokenDataBuilder" 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="secured_card_data"  xsi:type="string">\Eway\SecureFields\Gateway\Request\SecuredCardDataBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">\Eway\Rapid\Enum\ApiMethod::DIRECT</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsTokenDataBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="base_request"       xsi:type="string">\Eway\EwayRapid\Gateway\Request\BaseRequestDataBuilder</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>
                <item name="secured_card_data"  xsi:type="string">\Eway\SecureFields\Gateway\Request\SecuredCardDataBuilder</item>
                <item name="three_d_secure_auth" xsi:type="string">\Eway\DirectConnection\Gateway\Request\ThreeDSecureAuthBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">\Eway\Rapid\Enum\ApiMethod::DIRECT</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsTokenMOTODataBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="base_request"       xsi:type="string">EwayRapidSecureFieldsBaseRequestMOTODataBuilder</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>
                <item name="three_d_secure_auth" xsi:type="string">\Eway\DirectConnection\Gateway\Request\ThreeDSecureAuthBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">\Eway\Rapid\Enum\ApiMethod::DIRECT</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsTokenMOTODataMultishippingBuilder" type="\Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="base_request"       xsi:type="string">EwayRapidSecureFieldsBaseRequestMOTODataBuilder</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>
                <item name="three_d_secure_auth" xsi:type="string">\Eway\DirectConnection\Gateway\Request\ThreeDSecureAuthBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">\Eway\Rapid\Enum\ApiMethod::DIRECT</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidSecureFieldsBaseRequestMOTODataBuilder" type="\Eway\EwayRapid\Gateway\Request\BaseRequestDataBuilder">
        <arguments>
            <argument name="transactionType" xsi:type="const">\Eway\EwayRapid\Model\Config::MOTO</argument>
        </arguments>
    </virtualType>

    <!-- Blocks -->
    <virtualType name="EwayRapidSecureFieldsMycardForm" type="\Magento\Framework\View\Element\Template">
        <arguments>
            <argument name="data" xsi:type="array">
                <item name="template" xsi:type="string">Eway_SecureFields::form/mycard.phtml</item>
            </argument>
        </arguments>
    </virtualType>

    <type name="Eway\SecureFields\Block\Multishipping\Form\SecureFields">
        <arguments>
            <argument name="configProviders" xsi:type="array">
                <item name="braintree_config_provider" xsi:type="object">Magento\Braintree\Model\Ui\ConfigProvider</item>
                <item name="braintree_paypal_config_provider" xsi:type="object">Magento\Braintree\Model\Ui\PayPal\ConfigProvider</item>
            </argument>
        </arguments>
    </type>
</config>
