<?xml version="1.0"?>
<!--
/**
 * Copyright © 2020 CyberSource. All rights reserved.
 * See LICENSE.txt for license details.
 */
-->

<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="CyberSourceECheckPaymentGatewayFacade" type="Magento\Payment\Model\Method\Adapter">
        <arguments>
            <argument name="code" xsi:type="const">CyberSource\ECheck\Model\Ui\ConfigProvider::CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="valueHandlerPool" xsi:type="object">CyberSourceECheckPaymentGatewayValueHandlerPool</argument>
            <argument name="commandPool" xsi:type="object">CyberSourceECheckPaymentGatewayCommandPool</argument>
        </arguments>
    </virtualType>

    <!-- Configuration reader -->
    <type name="CyberSource\ECheck\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">CyberSource\ECheck\Model\Ui\ConfigProvider::CODE</argument>
        </arguments>
    </type>

    <!-- Commands infrastructure -->
    <virtualType name="CyberSourceECheckPaymentGatewayCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="capture" xsi:type="string">CyberSourceECheckPaymentGatewayCaptureCommand</item>
                <item name="void" xsi:type="string">CyberSourceECheckPaymentGatewayVoidCommand</item>
                <item name="cancel" xsi:type="string">CyberSourceECheckPaymentGatewayVoidCommand</item>
                <item name="refund" xsi:type="string">CyberSourceECheckPaymentGatewayVoidCommand</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Capture command -->
    <virtualType name="CyberSourceECheckPaymentGatewayCaptureCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSource\ECheck\Gateway\Request\CaptureRequest</argument>
            <argument name="handler" xsi:type="object">CyberSource\ECheck\Gateway\Response\ReasonCodeHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\ECheck\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\ECheck\Gateway\Validator\ResponseCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\ECheck\Gateway\Http\Client\Client</argument>
            <argument name="errorMessageMapper" xsi:type="object">CyberSource\Core\Gateway\ErrorMapper\ConfigurableMapper</argument>
        </arguments>
    </virtualType>

    <!-- Capture Request -->
    <type name="CyberSource\ECheck\Gateway\Request\CaptureRequest">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\ECheck\Gateway\Config\Config</argument>
        </arguments>
    </type>

    <!-- Void command -->
    <virtualType name="CyberSourceECheckPaymentGatewayVoidCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSource\ECheck\Gateway\Request\VoidRequest</argument>
            <argument name="handler" xsi:type="object">CyberSource\ECheck\Gateway\Response\VoidResponseHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\ECheck\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\ECheck\Gateway\Validator\ResponseCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\ECheck\Gateway\Http\Client\Client</argument>
        </arguments>
    </virtualType>

    <!-- Void Request -->
    <type name="CyberSource\ECheck\Gateway\Request\VoidRequest">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\ECheck\Gateway\Config\Config</argument>
        </arguments>
    </type>

    <!-- Response handlers -->
    <virtualType name="CyberSourceECheckPaymentGatewayResponseHandlerComposite" type="Magento\Payment\Gateway\Response\HandlerChain">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="reasoncode" xsi:type="string">CyberSource\ECheck\Gateway\Response\ReasonCodeHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Value handlers infrastructure -->
    <virtualType name="CyberSourceECheckPaymentGatewayValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">CyberSourceECheckPaymentGatewayConfigValueHandler</item>
                <item name="can_void" xsi:type="string">CyberSource\ECheck\Gateway\Config\CanVoidHandler</item>
                <item name="can_cancel" xsi:type="string">CyberSource\ECheck\Gateway\Config\CanVoidHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="CyberSourceECheckPaymentGatewayConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">CyberSource\ECheck\Gateway\Config\Config</argument>
        </arguments>
    </virtualType>

    <type name="CyberSource\ECheck\Cron\Status">
        <arguments>
            <argument name="command" xsi:type="object">CyberSource\ECheck\Gateway\Command\GetNotificationOfChangesReportCommand</argument>
        </arguments>
    </type>

    <type name="CyberSource\ECheck\Gateway\Command\GetNotificationOfChangesReportCommand">
        <arguments>
            <argument name="transferFactory" xsi:type="object">CyberSource\Core\Gateway\Http\TransferFactory</argument>
            <argument name="builder" xsi:type="object">CyberSource\Core\Gateway\Request\Rest\DateIntervalBuilder</argument>
            <argument name="client" xsi:type="object">CyberSourceCoreNotificationOfChangesClient</argument>
            <argument name="validator" xsi:type="object">CyberSource\Core\Gateway\Validator\ConversionDetailsValidator</argument>
            <argument name="mapper" xsi:type="object">CyberSource\Core\Gateway\Response\ConversionDetailsMapper</argument>
        </arguments>
    </type>

    <virtualType name="CyberSourceCoreNotificationOfChangesClient" type="CyberSource\Core\Gateway\Http\Client\Rest">
        <arguments>
            <argument name="requestMethod" xsi:type="const">Magento\Framework\HTTP\ZendClient::GET</argument>
            <argument name="requestPath" xsi:type="string">/reporting/v3/notification-of-changes</argument>
        </arguments>
    </virtualType>

    <!-- Logger, initialized with ModuleConfig -->
    <virtualType name="PaymentLogger" type="Magento\Payment\Model\Method\Logger">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\Core\Model\Config</argument>
        </arguments>
    </virtualType>

    <type name="CyberSource\ECheck\Gateway\Request\AbstractRequest">
        <arguments>
            <argument name="paymentLogger" xsi:type="object">PaymentLogger</argument>
        </arguments>
    </type>

</config>
