<?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="Magento\Sales\Model\Order\Email\Sender\OrderSender" type="NetworkInternational\NGenius\Model\Email\OrderSender"/>
    <type name="Magento\Quote\Observer\Webapi\SubmitObserver">
        <arguments>
            <argument name="orderSender" xsi:type="object">NetworkInternational\NGenius\Model\Email\OrderSender</argument>
        </arguments>
    </type>
    
    <!-- Payment Method Facade configuration -->
    <virtualType name="NGeniusFacade" type="Magento\Payment\Model\Method\Adapter">
        <arguments>
            <argument name="code" xsi:type="const">\NetworkInternational\NGenius\Gateway\Config\Config::CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">NetworkInternational\NGenius\Block\Info</argument>
            <argument name="valueHandlerPool" xsi:type="object">NGeniusValueHandlerPool</argument>
            <argument name="commandPool" xsi:type="object">NGeniusCommandPool</argument>
        </arguments>
    </virtualType>
    
    <virtualType name="NGeniusCaptureStrategyCommand" type="NetworkInternational\NGenius\Gateway\Command\CaptureStrategyCommand">
        <arguments>
            <argument name="commandPool" xsi:type="object">NGeniusCommandPool</argument>
        </arguments>
    </virtualType>

    <!-- Configuration reader -->
    <type name="NetworkInternational\NGenius\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">\NetworkInternational\NGenius\Gateway\Config\Config::CODE</argument>
        </arguments>
    </type>
    
    <!-- Logger, initialized with NGeniusConfig -->
    <virtualType name="NGeniusLogger" type="Magento\Payment\Model\Method\Logger">
        <arguments>
            <argument name="config" xsi:type="object">NetworkInternational\NGenius\Gateway\Config\Config</argument>
        </arguments>
    </virtualType>

    <type name="NetworkInternational\NGenius\Gateway\Http\Client\AbstractTransaction">
        <arguments>
            <argument name="logger" xsi:type="object">NGeniusLogger</argument>
        </arguments>
    </type>

    <!-- Commands infrastructure -->
    <virtualType name="NGeniusCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="authorize" xsi:type="string">NGeniusAuthorizeCommand</item>
                <item name="sale" xsi:type="string">NGeniusSaleCommand</item>
                <item name="capture" xsi:type="string">NGeniusCaptureStrategyCommand</item>
                <item name="settlement" xsi:type="string">NGeniusCaptureCommand</item>
                <item name="void" xsi:type="string">NGeniusVoidCommand</item>
                <item name="refund" xsi:type="string">NGeniusRefundCommand</item>
                <item name="cancel" xsi:type="string">NGeniusVoidCommand</item>
            </argument>
        </arguments>
    </virtualType>
    
    
    <!-- Sale command -->
    <virtualType name="NGeniusSaleCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">NGeniusSaleRequest</argument>
            <argument name="transferFactory" xsi:type="object">NetworkInternational\NGenius\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">NetworkInternational\NGenius\Gateway\Http\Client\TransactionSale</argument>
            <argument name="validator" xsi:type="object">NetworkInternational\NGenius\Gateway\Validator\ResponseValidator</argument>
        </arguments>
    </virtualType>
    <!-- Sale Request -->
    <virtualType name="NGeniusSaleRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="settlement" xsi:type="string">NetworkInternational\NGenius\Gateway\Request\SaleRequest</item>
            </argument>
        </arguments>
    </virtualType>
    
    <!-- Authorize command -->
    <virtualType name="NGeniusAuthorizeCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">NGeniusAuthorizationRequest</argument>
            <argument name="transferFactory" xsi:type="object">NetworkInternational\NGenius\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">NetworkInternational\NGenius\Gateway\Http\Client\TransactionAuth</argument>
            <argument name="validator" xsi:type="object">NetworkInternational\NGenius\Gateway\Validator\ResponseValidator</argument>
        </arguments>
    </virtualType>
    <!-- Authorization Request -->
    <virtualType name="NGeniusAuthorizationRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="transaction" xsi:type="string">NetworkInternational\NGenius\Gateway\Request\AuthorizationRequest</item>
            </argument>
        </arguments>
    </virtualType>
    
    <!-- Capture command -->
    <virtualType name="NGeniusCaptureCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">NetworkInternational\NGenius\Gateway\Request\CaptureRequest</argument>
            <argument name="transferFactory" xsi:type="object">NetworkInternational\NGenius\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">NetworkInternational\NGenius\Gateway\Http\Client\TransactionCapture</argument>
            <argument name="validator" xsi:type="object">NetworkInternational\NGenius\Gateway\Validator\CaptureValidator</argument>
        </arguments>
    </virtualType>


    <!-- Void command -->
    <virtualType name="NGeniusVoidCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">NetworkInternational\NGenius\Gateway\Request\VoidRequest</argument>
            <argument name="transferFactory" xsi:type="object">NetworkInternational\NGenius\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">NetworkInternational\NGenius\Gateway\Http\Client\TransactionVoid</argument>
            <argument name="validator" xsi:type="object">NetworkInternational\NGenius\Gateway\Validator\VoidValidator</argument>
        </arguments>
    </virtualType>
    
    <!-- Refund Command -->
    <virtualType name="NGeniusRefundCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">NetworkInternational\NGenius\Gateway\Request\RefundRequest</argument>
            <argument name="transferFactory" xsi:type="object">NetworkInternational\NGenius\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">NetworkInternational\NGenius\Gateway\Http\Client\TransactionRefund</argument>
            <argument name="validator" xsi:type="object">NetworkInternational\NGenius\Gateway\Validator\RefundValidator</argument>
        </arguments>
    </virtualType>
    <!-- END Refund Command -->
   
    <!-- Value handlers infrastructure -->
    <virtualType name="NGeniusValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">NGeniusConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="NGeniusConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">NetworkInternational\NGenius\Gateway\Config\Config</argument>
        </arguments>
    </virtualType>

    <type name="NetworkInternational\NGenius\Block\Info">
        <arguments>
            <argument name="config" xsi:type="object">NetworkInternational\NGenius\Gateway\Config\Config</argument>
        </arguments>
    </type>

</config>
