<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <virtualType name="PayByFacade" type="Magento\Payment\Model\Method\Adapter">
        <arguments>
            <argument name="code" xsi:type="const">VComm\PayBy\Gateway\Config\Config::CODE</argument>
            <argument name="valueHandlerPool" xsi:type="object">PayByValueHandlerPool</argument>
            <argument name="infoBlockType" xsi:type="string">VComm\PayBy\Block\Info</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="validatorPool" xsi:type="object">PayByValidatorPool</argument>
            <argument name="commandPool" xsi:type="object">PayByCommandPool</argument>
        </arguments>
    </virtualType>

    <!-- Configuration reader -->
    <type name="VComm\PayBy\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">VComm\PayBy\Gateway\Config\Config::CODE</argument>
        </arguments>
    </type>

    <virtualType name="PayByCaptureStrategyCommand" type="VComm\PayBy\Gateway\Command\CaptureStrategyCommand">
        <arguments>
            <argument name="commandPool" xsi:type="object">PayByCommandPool</argument>
        </arguments>
    </virtualType>

    <virtualType name="PayByValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">PayByConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="PayByConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">VComm\PayBy\Gateway\Config\Config</argument>
        </arguments>
    </virtualType>
    <virtualType name="PayByValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">VComm\PayBy\Gateway\Validator\CountryValidator</item>
            </argument>
        </arguments>
    </virtualType>

    <type name="VComm\PayBy\Logger\Handler">
        <arguments>
            <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
        </arguments>
    </type>
    <type name="VComm\PayBy\Logger\Logger">
        <arguments>
            <argument name="name" xsi:type="string">payByLogger</argument>
            <argument name="handlers"  xsi:type="array">
                <item name="system" xsi:type="object">VComm\PayBy\Logger\Handler</item>
            </argument>
        </arguments>
    </type>

    <!-- Authorize command -->
    <virtualType name="PayByAuthorizeCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">PayByAuthorizationRequest</argument>
            <argument name="transferFactory" xsi:type="object">VComm\PayBy\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">VComm\PayBy\Gateway\Http\Client\TransactionAuth</argument>
            <argument name="validator" xsi:type="object">VComm\PayBy\Gateway\Validator\ResponseValidator</argument>
        </arguments>
    </virtualType>

    <!-- Sale command -->
    <virtualType name="PayBySaleCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">PayBySaleRequest</argument>
            <argument name="transferFactory" xsi:type="object">VComm\PayBy\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">VComm\PayBy\Gateway\Http\Client\TransactionSale</argument>
            <argument name="validator" xsi:type="object">VComm\PayBy\Gateway\Validator\ResponseValidator</argument>
        </arguments>
    </virtualType>

    <!-- Sale Request -->
    <virtualType name="PayBySaleRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="settlement" xsi:type="string">VComm\PayBy\Gateway\Request\SaleRequest</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Authorization Request -->
    <virtualType name="PayByAuthorizationRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="transaction" xsi:type="string">VComm\PayBy\Gateway\Request\AuthorizationRequest</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Capture command -->
    <virtualType name="PayByCaptureCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">VComm\PayBy\Gateway\Request\CaptureRequest</argument>
            <argument name="transferFactory" xsi:type="object">VComm\PayBy\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">VComm\PayBy\Gateway\Http\Client\TransactionCapture</argument>
            <argument name="validator" xsi:type="object">VComm\PayBy\Gateway\Validator\CaptureValidator</argument>
        </arguments>
    </virtualType>


    <!-- Void command -->
    <virtualType name="PayByVoidCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">VComm\PayBy\Gateway\Request\VoidRequest</argument>
            <argument name="transferFactory" xsi:type="object">VComm\PayBy\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">VComm\PayBy\Gateway\Http\Client\TransactionVoid</argument>
            <argument name="validator" xsi:type="object">VComm\PayBy\Gateway\Validator\VoidValidator</argument>
        </arguments>
    </virtualType>

    <!-- Refund Command -->
    <virtualType name="PayByRefundCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">VComm\PayBy\Gateway\Request\RefundRequest</argument>
            <argument name="transferFactory" xsi:type="object">VComm\PayBy\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">VComm\PayBy\Gateway\Http\Client\TransactionRefund</argument>
            <argument name="validator" xsi:type="object">VComm\PayBy\Gateway\Validator\RefundValidator</argument>
        </arguments>
    </virtualType>

    <!-- Commands infrastructure -->
    <virtualType name="PayByCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="authorize" xsi:type="string">PayByAuthorizeCommand</item>
                <item name="sale" xsi:type="string">PayBySaleCommand</item>
                <item name="capture" xsi:type="string">PayByCaptureStrategyCommand</item>
                <item name="settlement" xsi:type="string">PayByCaptureCommand</item>
                <item name="void" xsi:type="string">PayByVoidCommand</item>
                <item name="refund" xsi:type="string">PayByRefundCommand</item>
                <item name="cancel" xsi:type="string">PayByVoidCommand</item>
            </argument>
        </arguments>
    </virtualType>
    <type name="VComm\PayBy\Block\Info">
        <arguments>
            <argument name="config" xsi:type="object">VComm\PayBy\Gateway\Config\Config</argument>
        </arguments>
    </type>

    <!-- Configuration reader -->
    <type name="VComm\PayBy\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">\VComm\PayBy\Gateway\Config\Config::CODE</argument>
        </arguments>
    </type>
</config>
