<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Eway\EwayRapid\Model\Customer\Token\ManagerInterface" type="Eway\EwayRapid\Model\Customer\Token\Manager"/>
    <preference for="Magento\Payment\Gateway\Data\Quote\QuoteAdapter" type="Eway\EwayRapid\Gateway\QuoteAdapter" />
    <preference for="Eway\EwayRapid\Api\Data\OrderCreationExceptionSearchResultsInterface" type="Magento\Framework\Api\SearchResults" />
    <preference for="Eway\EwayRapid\Api\Data\OrderCreationExceptionInterface" type="Eway\EwayRapid\Model\OrderCreationException" />
    <preference for="Eway\EwayRapid\Api\OrderCreationExceptionRepositoryInterface" type="Eway\EwayRapid\Model\OrderCreationExceptionRepository" />

    <virtualType name="EwayRapidMethodAdapter" type="Eway\EwayRapid\Model\Method\Adapter">
        <arguments>
            <argument name="config" xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </virtualType>

    <!-- ###############################################################################################-->
    <!-- ################               COMMON FOR ALL METHODS                          ################-->
    <!-- ###############################################################################################-->
    <!-- Config -->
    <virtualType name="EwayRapidConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">\Eway\EwayRapid\Model\Ui\ConfigProvider::CODE</argument>
        </arguments>
    </virtualType>
    <type name="Eway\EwayRapid\Model\Ui\ConfigProvider">
        <arguments>
            <argument name="config" xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </type>
    <type name="Eway\EwayRapid\Model\ModuleHelper">
        <arguments>
            <argument name="config" xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </type>
    <type name="Eway\EwayRapid\Model\PaymentMethod\Config">
        <arguments>
            <argument name="config" xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </type>

    <!-- Logger -->
    <virtualType name="EwayRapidDefaultLoggerHandler" type="Eway\EwayRapid\Model\Logger\Handler">
        <arguments>
            <argument name="fileName" xsi:type="string">/var/log/ewayrapid_debug.log</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidCronLoggerHandler" type="Eway\EwayRapid\Model\Logger\Handler">
        <arguments>
            <argument name="fileName" xsi:type="string">/var/log/ewayrapid_cron.log</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidLogger" type="Monolog\Logger">
        <arguments>
            <argument name="name" xsi:type="string">ewayrapid</argument>
            <argument name="handlers" xsi:type="array">
                <item name="ewayrapid" xsi:type="object">EwayRapidDefaultLoggerHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidCronLogger" type="Monolog\Logger">
        <arguments>
            <argument name="name" xsi:type="string">ewayrapid_cron</argument>
            <argument name="handlers" xsi:type="array">
                <item name="ewayrapid" xsi:type="object">EwayRapidCronLoggerHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidPaymentLogger" type="Magento\Payment\Model\Method\Logger">
        <arguments>
            <argument name="config" xsi:type="object">EwayRapidConfig</argument>
            <argument name="logger" xsi:type="object">EwayRapidLogger</argument>
        </arguments>
    </virtualType>

    <!-- Value Handler Pool -->
    <virtualType name="EwayRapidConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </virtualType>
    <type name="Eway\EwayRapid\Gateway\Config\DefaultValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">EwayRapidConfigValueHandler</item>
            </argument>
        </arguments>
    </type>
    <virtualType name="EwayRapidDefaultValueHandlerPool" type="Eway\EwayRapid\Gateway\Config\DefaultValueHandlerPool"/>

    <!-- Validator Pool -->
    <virtualType name="EwayRapidCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidGlobalValidator" type="Magento\Payment\Gateway\Validator\ValidatorComposite">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="cart_total_range" xsi:type="string">Eway\EwayRapid\Gateway\Validator\CartTotalRangeValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="global" xsi:type="string">EwayRapidGlobalValidator</item>
                <item name="country" xsi:type="string">EwayRapidCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Client -->
    <type name="Eway\EwayRapid\Gateway\Client\Sdk">
        <arguments>
            <argument name="logger" xsi:type="object">EwayRapidLogger</argument>
            <argument name="config" xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </type>
    <virtualType name="EwayRapidClientCreateTransaction" type="Eway\EwayRapid\Gateway\Client\Sdk">
        <arguments>
            <argument name="operation" xsi:type="const">\Eway\EwayRapid\Gateway\Client\Sdk::CREATE_TRANSACTION</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidClientQueryTransaction" type="Eway\EwayRapid\Gateway\Client\Sdk">
        <arguments>
            <argument name="operation" xsi:type="const">\Eway\EwayRapid\Gateway\Client\Sdk::QUERY_TRANSACTION</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidClientCreateCustomer" type="Eway\EwayRapid\Gateway\Client\Sdk">
        <arguments>
            <argument name="operation" xsi:type="const">\Eway\EwayRapid\Gateway\Client\Sdk::CREATE_CUSTOMER</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidClientUpdateCustomer" type="Eway\EwayRapid\Gateway\Client\Sdk">
        <arguments>
            <argument name="operation" xsi:type="const">\Eway\EwayRapid\Gateway\Client\Sdk::UPDATE_CUSTOMER</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidClientQueryToken" type="Eway\EwayRapid\Gateway\Client\Sdk">
        <arguments>
            <argument name="operation" xsi:type="const">\Eway\EwayRapid\Gateway\Client\Sdk::QUERY_CUSTOMER_TOKEN</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidClientCancelTransaction" type="Eway\EwayRapid\Gateway\Client\Sdk">
        <arguments>
            <argument name="operation" xsi:type="const">\Eway\EwayRapid\Gateway\Client\Sdk::CANCEL_TRANSACTION</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidClientRefundTransaction" type="Eway\EwayRapid\Gateway\Client\Sdk">
        <arguments>
            <argument name="operation" xsi:type="const">\Eway\EwayRapid\Gateway\Client\Sdk::REFUND_TRANSACTION</argument>
        </arguments>
    </virtualType>

    <!-- Command Pool -->
    <type name="Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="logger" xsi:type="object">EwayRapidLogger</argument>
        </arguments>
    </type>
    <virtualType name="EwayRapidPreAuthCaptureCommand" type="Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCreateTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidCaptureDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="handler"            xsi:type="object">EwayRapidTransactionCaptureHandler</argument>
            <argument name="validator"          xsi:type="object">EwayRapidPaymentActionValidator</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidCancelTransactionCommand" type="Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientCancelTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">\Eway\EwayRapid\Gateway\Request\TransactionIdDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidPaymentActionValidator</argument>
            <argument name="handler"            xsi:type="object">\Eway\EwayRapid\Gateway\Response\TransactionCancelHandler</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidRefundTransactionCommand" type="Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientRefundTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">EwayRapidRefundDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="validator"          xsi:type="object">EwayRapidPaymentActionValidator</argument>
            <argument name="handler"            xsi:type="object">\Eway\EwayRapid\Gateway\Response\TransactionCancelHandler</argument>
        </arguments>
    </virtualType>

    <virtualType name="EwayRapidQueryTransactionByIdCommand" type="Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientQueryTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">\Eway\EwayRapid\Gateway\Request\TransactionIdDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="handler"            xsi:type="object">\Eway\EwayRapid\Gateway\Response\ResponseMessagesHandler</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidQueryTransactionByIdMultishippingCommand" type="Eway\EwayRapid\Gateway\Command\GenericCommand">
        <arguments>
            <argument name="client"             xsi:type="object">EwayRapidClientQueryTransaction</argument>
            <argument name="requestBuilder"     xsi:type="object">\Eway\EwayRapid\Gateway\Request\TransactionIdDataBuilder</argument>
            <argument name="transferFactory"    xsi:type="object">EwayRapidTransferFactory</argument>
            <argument name="handler"            xsi:type="object">EwayRapidQueryTransactionMultishippingResponseHandler</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidQueryTransactionMultishippingResponseHandler" type="Magento\Payment\Gateway\Response\HandlerChain">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="eway_rapid_query_transaction_handler"    xsi:type="string">\Eway\EwayRapid\Gateway\Response\ResponseMessagesHandler</item>
                <item name="response_storage"   xsi:type="string">\Eway\EwayRapid\Gateway\Response\Multishipping\QueryTransactionHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Request Builder -->
    <type name="Eway\EwayRapid\Gateway\Request\AbstractDataBuilder">
        <arguments>
            <argument name="config" xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </type>
    <virtualType name="EwayRapidCaptureDataBuilder" type="Eway\EwayRapid\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="payment"        xsi:type="string">\Eway\EwayRapid\Gateway\Request\PaymentDataBuilder</item>
                <item name="transaction_id" xsi:type="string">\Eway\EwayRapid\Gateway\Request\TransactionIdDataBuilder</item>
            </argument>
            <argument name="method" xsi:type="const">\Eway\Rapid\Enum\ApiMethod::AUTHORISATION</argument>
        </arguments>
    </virtualType>
    <virtualType name="EwayRapidRefundDataBuilder" 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="refund"             xsi:type="string">\Eway\EwayRapid\Gateway\Request\RefundDataBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Transfer Factory -->
    <virtualType name="EwayRapidTransferFactory" type="Eway\EwayRapid\Gateway\Http\TransferFactory">
        <arguments>
            <argument name="config" xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </virtualType>

    <!-- Response Handlers -->
    <virtualType name="EwayRapidTransactionCaptureHandler" type="Eway\EwayRapid\Gateway\Response\TransactionCaptureHandler" />

    <virtualType name="EwayRapidCreateTokenHandler" type="Eway\EwayRapid\Gateway\Response\CreateTokenHandler" />
    <virtualType name="EwayRapidCreateTokenMultishippingResponseHandler" type="Magento\Payment\Gateway\Response\HandlerChain">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="eway_rapid_create_token_handler"    xsi:type="string">EwayRapidCreateTokenHandler</item>
                <item name="response_storage"   xsi:type="string">\Eway\EwayRapid\Gateway\Response\Multishipping\CreateTokenHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="EwayRapidUpdateTokenHandler" type="Eway\EwayRapid\Gateway\Response\UpdateTokenHandler" />

    <!-- Response Validator -->
    <virtualType name="EwayRapidPaymentActionValidator" type="Eway\EwayRapid\Gateway\Validator\PaymentActionsValidator" />
    <virtualType name="EwayRapidCreateTokenValidator" type="Eway\EwayRapid\Gateway\Validator\CreateTokenValidator" />

    <type name="Eway\EwayRapid\Plugin\StateCommandPlugin">
        <arguments>
            <argument name="config" xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </type>
    <type name="Eway\EwayRapid\Block\Mycards\Listing">
        <arguments>
            <argument name="config" xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </type>
    <type name="Eway\EwayRapid\Cron\VerifyOrders">
        <arguments>
            <argument name="logger" xsi:type="object">EwayRapidCronLogger</argument>
        </arguments>
    </type>
    <type name="Eway\EwayRapid\Model\Customer\Token\Manager">
        <arguments>
            <argument name="customerProvider" xsi:type="object">\Eway\EwayRapid\Model\Customer\Adminhtml\Provider</argument>
        </arguments>
    </type>
    <type name="Eway\EwayRapid\Model\Version">
        <arguments>
            <argument name="components" xsi:type="array">
                <item name="Eway_EwayRapid" xsi:type="string">Base</item>
            </argument>
        </arguments>
    </type>
    <type name="Eway\EwayRapid\Block\Info\Cc">
        <arguments>
            <argument name="config" xsi:type="object">EwayRapidConfig</argument>
        </arguments>
    </type>

    <!-- Plugin -->
    <type name="Magento\Payment\Model\PaymentMethodList">
        <plugin name="eway_ewayrapid_plugin_magento_payment_model_paymentmethodlist"
                type="Eway\EwayRapid\Plugin\Magento\Payment\Model\PaymentMethodList"/>
    </type>
    <type name="Magento\Multishipping\Controller\Checkout\OverviewPost">
        <plugin name="eway_ewayrapid_plugin_magento_multishipping_controller_checkout_overviewpost"
                type="Eway\EwayRapid\Plugin\Magento\Multishipping\Controller\Checkout\OverviewPost"/>
    </type>
    <type name="Magento\Quote\Model\Quote">
        <plugin name="eway_ewayrapid_plugin_magento_quote_model_quote"
                type="Eway\EwayRapid\Plugin\Magento\Quote\Model\Quote"/>
    </type>
    <type name="Magento\CheckoutAgreements\Model\Checkout\Plugin\Validation">
        <plugin name="eway_ewayrapid_plugin_magento_checkout_agreements_model_checkout_plugin_validation"
                type="Eway\EwayRapid\Plugin\Magento\CheckoutAgreements\Model\Checkout\Plugin\Validation"/>
    </type>

    <type name="Magento\Quote\Model\QuoteManagement">
        <plugin name="eway_ewayrapid_plugin_magento_quote_model_quotemanagement"
                type="Eway\EwayRapid\Plugin\Magento\Quote\Model\QuoteManagement"/>
    </type>

    <type name="Magento\Multishipping\Model\Checkout\Type\Multishipping\PlaceOrderDefault">
        <plugin name="eway_ewayrapid_plugin_magento_multishipping_model_checkout_type_multishipping_placeorderdefault"
                type="Eway\EwayRapid\Plugin\Magento\Multishipping\Model\Checkout\Type\Multishipping\PlaceOrderDefault"/>
    </type>

    <type name="Eway\EwayRapid\Gateway\Response\Multishipping\HandlerComposite">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="create_token_handler" xsi:type="object">\Eway\EwayRapid\Gateway\Response\Multishipping\Handler\CreateTokenHandler</item>
                <item name="card_details_handler" xsi:type="object">\Eway\EwayRapid\Gateway\Response\Multishipping\Handler\CardDetailsHandler</item>
                <item name="payment_details_handler" xsi:type="object">\Eway\EwayRapid\Gateway\Response\Multishipping\Handler\PaymentDetailsHandler</item>
                <item name="order_details_handler" xsi:type="object">\Eway\EwayRapid\Gateway\Response\Multishipping\Handler\OrderDetailsHandler</item>
                <item name="query_transaction_handler" xsi:type="object">\Eway\EwayRapid\Gateway\Response\Multishipping\Handler\QueryTransactionHandler</item>
            </argument>
        </arguments>
    </type>

    <!-- Admin grid data provider -->
    <type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="ewayrapid_order_exception_listing_data_source" xsi:type="string">order_exception_collection</item>
            </argument>
        </arguments>
    </type>
    <virtualType name="order_exception_collection" type="Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult">
        <arguments>
            <argument name="mainTable" xsi:type="string">eway_order_creation_exception</argument>
            <argument name="resourceModel" xsi:type="string">Eway\EwayRapid\Model\ResourceModel\OrderCreationException\Collection</argument>
        </arguments>
    </virtualType>
</config>
