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

    <!--
        Widens the 3 RazerPay_Payment classes that hardcode ConfigProvider::CODE so orders
        placed under razerpay_payment_agent are recognized by them too. Merchant credentials
        (merchant_id/verify_key/secret_key/channels) are read from the existing, untouched
        RazerPay\Payment\Gateway\Config\Config singleton (bound to razerpay_payment scope) -
        shared automatically since these classes concretely type-hint that class.
    -->
    <type name="RazerPay\Payment\Model\Checkout\HostedParamsService">
        <arguments>
            <argument name="supportedMethodCodes" xsi:type="array">
                <item name="razerpay_payment" xsi:type="const">RazerPay\Payment\Model\Ui\ConfigProvider::CODE</item>
                <item name="razerpay_payment_agent" xsi:type="const">RazerPay\PaymentAgent\Model\PaymentMethodCode::CODE</item>
            </argument>
        </arguments>
    </type>

    <type name="RazerPay\Payment\Plugin\Sales\Order\Email\Sender\DeferPendingPaymentOrderEmail">
        <arguments>
            <argument name="supportedMethodCodes" xsi:type="array">
                <item name="razerpay_payment" xsi:type="const">RazerPay\Payment\Model\Ui\ConfigProvider::CODE</item>
                <item name="razerpay_payment_agent" xsi:type="const">RazerPay\PaymentAgent\Model\PaymentMethodCode::CODE</item>
            </argument>
        </arguments>
    </type>

    <type name="RazerPay\Payment\Cron\CancelExpiredPendingPaymentOrders">
        <arguments>
            <argument name="supportedMethodCodes" xsi:type="array">
                <item name="razerpay_payment" xsi:type="const">RazerPay\Payment\Model\Ui\ConfigProvider::CODE</item>
                <item name="razerpay_payment_agent" xsi:type="const">RazerPay\PaymentAgent\Model\PaymentMethodCode::CODE</item>
            </argument>
        </arguments>
    </type>

    <!-- Method-agnostic config instance for this method's own active/title scope only -->
    <virtualType name="RazerPayPaymentAgentOwnConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">RazerPay\PaymentAgent\Model\PaymentMethodCode::CODE</argument>
        </arguments>
    </virtualType>

    <virtualType name="RazerPayPaymentAgentValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">RazerPayPaymentAgentConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="RazerPayPaymentAgentConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">RazerPayPaymentAgentOwnConfig</argument>
        </arguments>
    </virtualType>

    <virtualType name="RazerPayPaymentAgentFacade" type="Magento\Payment\Model\Method\Adapter">
        <arguments>
            <argument name="code" xsi:type="const">RazerPay\PaymentAgent\Model\PaymentMethodCode::CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">RazerPay\Payment\Block\Sales\Order\Info</argument>
            <argument name="valueHandlerPool" xsi:type="object">RazerPayPaymentAgentValueHandlerPool</argument>
            <argument name="commandPool" xsi:type="object">RazerPayPaymentAgentCommandPool</argument>
            <argument name="logger" xsi:type="object">RazerPay\Payment\Logger\Logger</argument>
        </arguments>
    </virtualType>

    <!-- Command pool reuses RazerPay_Payment's gateway request/client classes verbatim (method-code-agnostic) -->
    <virtualType name="RazerPayPaymentAgentCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="initialize" xsi:type="string">RazerPayPaymentAgentInitializeCommand</item>
                <item name="capture" xsi:type="string">RazerPayPaymentAgentCaptureCommand</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="RazerPayPaymentAgentInitializeCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">RazerPayPaymentAgentInitializationRequest</argument>
            <argument name="transferFactory" xsi:type="object">RazerPay\Payment\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">RazerPay\Payment\Gateway\Http\Client\Client</argument>
            <argument name="logger" xsi:type="object">RazerPay\Payment\Logger\Logger</argument>
        </arguments>
    </virtualType>

    <virtualType name="RazerPayPaymentAgentInitializationRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="transaction" xsi:type="string">RazerPay\Payment\Gateway\Request\InitializationRequest</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="RazerPayPaymentAgentCaptureCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">RazerPayPaymentAgentCaptureRequest</argument>
            <argument name="transferFactory" xsi:type="object">RazerPay\Payment\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">RazerPay\Payment\Gateway\Http\Client\CaptureClient</argument>
            <argument name="validator" xsi:type="object">RazerPay\Payment\Gateway\Validator\CaptureValidator</argument>
            <argument name="logger" xsi:type="object">RazerPay\Payment\Logger\Logger</argument>
        </arguments>
    </virtualType>

    <virtualType name="RazerPayPaymentAgentCaptureRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="transaction" xsi:type="string">RazerPay\Payment\Gateway\Request\CaptureRequest</item>
            </argument>
        </arguments>
    </virtualType>

    <preference for="RazerPay\PaymentAgent\Api\PaymentLinkManagementInterface" type="RazerPay\PaymentAgent\Model\PaymentLinkManagement" />
    <preference for="RazerPay\PaymentAgent\Api\Data\PaymentLinkInterface" type="RazerPay\PaymentAgent\Model\Data\PaymentLink" />
    <preference for="RazerPay\PaymentAgent\Api\ChannelManagementInterface" type="RazerPay\PaymentAgent\Model\ChannelManagement" />
    <preference for="RazerPay\PaymentAgent\Api\Data\ChannelInterface" type="RazerPay\PaymentAgent\Model\Data\Channel" />

</config>
