<?xml version="1.0"?>
<!--
/**
 * Copyright © 2018 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">
    <!-- Logger configuration -->
    <preference for="CyberSource\Core\Model\LoggerInterface" type="CyberSource\Core\Model\Logger" />

    <preference for="CyberSource\Core\Model\Checkout\PaymentFailureRouteProviderInterface" type="CyberSource\Core\Model\Checkout\PaymentFailureRouteProvider"/>
    
    <preference for="CyberSource\Core\Service\OrderToQuoteInterface" type="CyberSource\Core\Service\OrderToQuoteService"/>

    <type name="CyberSource\Core\Model\LoggerInterface">
        <plugin name="cyberSourceLoggerCensorPlugin" type="\CyberSource\Core\Plugin\LoggerCensorPlugin" />
    </type>

    <type name="CyberSource\Core\Model\Logger">
        <arguments>
            <argument name="name" xsi:type="string">CyberSource Logger</argument>
            <argument name="handlers" xsi:type="array">
                <item name="cybs" xsi:type="object">CyberSourceCoreLoggerHandler</item>
            </argument>
        </arguments>
    </type>

    <virtualType name="CyberSourceCoreLoggerHandler" type="Magento\Framework\Logger\Handler\Base">
        <arguments>
            <argument name="fileName" xsi:type="string">/var/log/cybs.log</argument>
        </arguments>
    </virtualType>

    <type name="CyberSource\Core\Helper\Data">
        <arguments>
            <argument name="serializer" xsi:type="object">CyberSource\Core\Serialize\JsonObjectSerializer</argument>
        </arguments>
    </type>

    <!-- Configuration reader -->
    <type name="CyberSource\Core\Model\Config">
        <arguments>
            <argument name="pathPattern" xsi:type="const">Magento\Payment\Gateway\Config\Config::DEFAULT_PATH_PATTERN</argument>
            <argument name="methodCode" xsi:type="const">CyberSource\Core\Model\Config::CODE</argument>
        </arguments>
    </type>

    <type name="CyberSource\Core\Cron\DecisionManagerReport">
        <arguments>
            <argument name="conversionReportCommand" xsi:type="object">CyberSourceCoreGatewayCommandGetConversionReportCommand</argument>
        </arguments>
    </type>

    <type name="Magento\Framework\App\Request\CsrfValidator">
        <plugin name="cybersourceDisableCsrfValidationPlugin" type="CyberSource\Core\Plugin\App\Request\CsrfValidatorPlugin"/>
    </type>

    <type name="Magento\Backend\App\Request\BackendValidator">
        <plugin name="cybersourceDisableBackendCsrfValidationPlugin" type="CyberSource\Core\Plugin\App\Request\CsrfValidatorPlugin"/>
    </type>

    <virtualType name="CyberSourceCoreGatewayCommandGetConversionReportCommand" type="CyberSource\Core\Gateway\Command\RestGetCommand">
        <arguments>
            <argument name="transferFactory" xsi:type="object">CyberSource\Core\Gateway\Http\TransferFactory</argument>
            <argument name="builder" xsi:type="object">CyberSourceCoreGatewayRequestRestConversionDetailsBuilder</argument>
            <argument name="client" xsi:type="object">CyberSourceCoreConversionDetailsClient</argument>
            <argument name="validator" xsi:type="object">CyberSourceCoreGatewayValidatorConversionDetailsValidator</argument>
            <argument name="mapper" xsi:type="object">CyberSource\Core\Gateway\Response\ConversionDetailsMapper</argument>
            <argument name="exceptionMessage" xsi:type="string">Failed to load conversion details report. Please verify extension configuration.</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRequestRestConversionDetailsBuilder" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="timeInterval" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\TimeIntervalBuilder</item>
                <item name="orgId" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\OrganizationIdBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayValidatorConversionDetailsValidator" type="Magento\Payment\Gateway\Validator\ValidatorComposite">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="restvalidator" xsi:type="string">CyberSource\Core\Gateway\Validator\RestResponseCodeValidator</item>
                <item name="conversionDetailsValidator" xsi:type="string">CyberSource\Core\Gateway\Validator\ConversionDetailsValidator</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreConversionDetailsClient" 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/conversion-details</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreSecureFileShareGetListCommand" type="CyberSource\Core\Gateway\Command\RestGetCommand">
        <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">CyberSourceCoreSecureFileShareGetListClient</argument>
            <argument name="validator" xsi:type="object">CyberSource\Core\Gateway\Validator\RestResponseCodeValidator</argument>
            <argument name="exceptionMessage" xsi:type="string">Failed to load Secure File Share list. Please verify extension configuration.</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreSecureFileShareGetListClient" 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">/sfs/v1/file-details</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreSecureFileShareGetFileCommand" type="CyberSource\Core\Gateway\Command\RestGetCommand">
        <arguments>
            <argument name="transferFactory" xsi:type="object">CyberSource\Core\Gateway\Http\TransferFactory</argument>
            <argument name="builder" xsi:type="object">CyberSourceCoreSecureFileShareGetFileRequestBuilder</argument>
            <argument name="client" xsi:type="object">CyberSourceCoreSecureFileShareGetFileClient</argument>
            <argument name="validator" xsi:type="object">CyberSource\Core\Gateway\Validator\RestResponseCodeValidator</argument>
            <argument name="exceptionMessage" xsi:type="string">Failed to load Secure File Share file. Please verify extension configuration.</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreSecureFileShareGetFileRequestBuilder" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="fileId" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\SfsFileIdBuilder</item>
                <item name="orgId" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\OrganizationIdBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreSecureFileShareGetFileClient" 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">/sfs/v1/files</argument>
            <argument name="contentType" xsi:type="string">*/*</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestBaseCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="transferFactory" xsi:type="object">CyberSource\Core\Gateway\Http\TransferFactory</argument>
            <argument name="errorMessageMapper" xsi:type="object">CyberSource\Core\Gateway\ErrorMapper\ConfigurableMapper</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestAuthorizeCommand" type="CyberSourceCoreGatewayRestBaseCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceCoreGatewayRestAuthorizationRequest</argument>
            <argument name="handler" xsi:type="object">CyberSourceCoreGatewayRestAuthorizationHandler</argument>
            <argument name="validator" xsi:type="object">CyberSourceCoreGatewayValidatorRestCreateResponseCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSourceCoreGatewayRestPaymentsClient</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestAuthorizationRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="partnerInformationBuilder" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\PartnerInformationBuilder</item>
                <item name="orderItemsInformation" xsi:type="string">CyberSourceCoreGatewayRestAuthorizationItemsDataBuilder</item>
                <item name="paymentInformation" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\PaymentDataBuilder</item>
                <item name="addressInformation" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\AddressDataBuilder</item>
                <item name="deviceFingerprint" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\DeviceFingerprintBuilder</item>
                <item name="mddInformation" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\DecisionManagerMddBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestAuthorizationItemsDataBuilder" type="CyberSource\Core\Gateway\Request\Rest\OrderItemsBuilder">
        <arguments>
            <argument name="objectName" xsi:type="string">order</argument>
            <argument name="filter" xsi:type="object">CyberSourceCoreGatewayStringProductNameFilter</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestPaymentsClient" type="CyberSource\Core\Gateway\Http\Client\Rest">
        <arguments>
            <argument name="requestMethod" xsi:type="const">Magento\Framework\HTTP\ZendClient::POST</argument>
            <argument name="requestPath" xsi:type="string">/pts/v2/payments</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayValidatorRestCreateResponseCodeValidator" type="CyberSource\Core\Gateway\Validator\RestResponseCodeValidator">
        <arguments>
            <argument name="validResponseCode" xsi:type="const">CyberSource\Core\Gateway\Validator\RestResponseCodeValidator::RESPONSE_CODE_CREATED</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestAuthorizationHandler" type="Magento\Payment\Gateway\Response\HandlerChain">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="transactionDetails" xsi:type="string">CyberSourceCoreGatewayRestAuthorizationTransactionDetailsHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestAuthorizationTransactionDetailsHandler" type="CyberSource\Core\Gateway\Response\Rest\TransactionDetailsHandler">
        <arguments>
            <argument name="shouldCloseTransaction" xsi:type="boolean">false</argument>
            <argument name="shouldCloseParentTransaction" xsi:type="boolean">false</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestVoidTransactionDetailsHandler" type="CyberSource\Core\Gateway\Response\Rest\TransactionDetailsHandler">
        <arguments>
            <argument name="shouldCloseTransaction" xsi:type="boolean">true</argument>
            <argument name="shouldCloseParentTransaction" xsi:type="boolean">true</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestSettlementCommand" type="CyberSourceCoreGatewayRestBaseCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceCoreGatewayRestSettlementRequest</argument>
            <argument name="validator" xsi:type="object">CyberSourceCoreGatewayValidatorRestCreateResponseCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSourceCoreGatewayRestPaymentsClient</argument>
            <argument name="handler" xsi:type="object">CyberSource\Core\Gateway\Response\Rest\CaptureResponseHandler</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestSettlementRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="partnerInformationBuilder" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\PartnerInformationBuilder</item>
                <item name="orderItemsInformation" xsi:type="string">CyberSourceCoreGatewayRestAuthorizationItemsDataBuilder</item>
                <item name="paymentInformation" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\PaymentDataBuilder</item>
                <item name="captureId" xsi:type="string">CyberSourceCoreGatewayRestCapturesUriBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestCapturesUriBuilder" type="CyberSource\Core\Gateway\Request\Rest\OperationBuilder">
        <arguments>
            <argument name="operationName" xsi:type="string">captures</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRefundCommand" type="CyberSourceCoreGatewayRestBaseCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceCoreGatewayRestRefundRequest</argument>
            <argument name="client" xsi:type="object">CyberSourceCoreGatewayRestPaymentsClient</argument>
            <argument name="handler" xsi:type="object">CyberSource\Core\Gateway\Response\Rest\RefundResponseHandler</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestRefundRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="partnerInformationBuilder" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\PartnerInformationBuilder</item>
                <item name="orderItemsInformation" xsi:type="string">CyberSourceCoreGatewayRestAuthorizationItemsDataBuilder</item>
                <item name="paymentInformation" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\PaymentDataBuilder</item>
                <item name="refundId" xsi:type="string">CyberSourceCoreGatewayRestRefundsUriBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestRefundsUriBuilder" type="CyberSource\Core\Gateway\Request\Rest\OperationBuilder">
        <arguments>
            <argument name="operationName" xsi:type="string">refunds</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayVoidCommand" type="CyberSourceCoreGatewayRestBaseCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceCoreGatewayRestVoidRequest</argument>
            <argument name="client" xsi:type="object">CyberSourceCoreGatewayRestPaymentsClient</argument>
            <argument name="handler" xsi:type="object">CyberSourceCoreGatewayRestVoidTransactionDetailsHandler</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestVoidRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="partnerInformationBuilder" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\PartnerInformationBuilder</item>
                <item name="orderItemsInformation" xsi:type="string">CyberSourceCoreGatewayRestAuthorizationItemsDataBuilder</item>
                <item name="paymentInformation" xsi:type="string">CyberSource\Core\Gateway\Request\Rest\PaymentDataBuilder</item>
                <item name="voidId" xsi:type="string">CyberSourceCoreGatewayRestVoidsUriBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayRestVoidsUriBuilder" type="CyberSource\Core\Gateway\Request\Rest\OperationBuilder">
        <arguments>
            <argument name="operationName" xsi:type="string">voids</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayStringProductNameFilter" type="CyberSource\Core\StringUtils\FilterChain">
        <arguments>
            <argument name="filters" xsi:type="array">
                <item name="alphanumFilter" xsi:type="string">CyberSource\Core\StringUtils\AlphaNumFilter</item>
                <item name="maxLengthFilter" xsi:type="string">CyberSource\Core\StringUtils\MaxLengthFilter</item>
                <item name="trimFilter"  xsi:type="string">CyberSource\Core\StringUtils\TrimFilter</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayString255Filter" type="CyberSource\Core\StringUtils\MaxLengthFilter">
        <arguments>
            <argument name="maxLength" xsi:type="number">255</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayString60Filter" type="CyberSource\Core\StringUtils\MaxLengthFilter">
        <arguments>
            <argument name="maxLength" xsi:type="number">60</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayString50Filter" type="CyberSource\Core\StringUtils\MaxLengthFilter">
        <arguments>
            <argument name="maxLength" xsi:type="number">50</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayString15Filter" type="CyberSource\Core\StringUtils\MaxLengthFilter">
        <arguments>
            <argument name="maxLength" xsi:type="number">15</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayString10Filter" type="CyberSource\Core\StringUtils\MaxLengthFilter">
        <arguments>
            <argument name="maxLength" xsi:type="number">10</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayAlphaNumString60Filter" type="CyberSource\Core\StringUtils\FilterChain">
        <arguments>
            <argument name="filters" xsi:type="array">
                <item name="alphaNumFilter" xsi:type="string">CyberSource\Core\StringUtils\AlphaNumFilter</item>
                <item name="maxLengthFilter" xsi:type="string">CyberSource\Core\StringUtils\MaxLengthFilter</item>
                <item name="trimFilter"  xsi:type="string">CyberSource\Core\StringUtils\TrimFilter</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceCoreGatewayStringFilterPool" type="CyberSource\Core\StringUtils\FilterPool">
        <arguments>
            <argument name="filters" xsi:type="array">
                <item name="string255" xsi:type="string">CyberSourceCoreGatewayString255Filter</item>
                <item name="string60" xsi:type="string">CyberSourceCoreGatewayString60Filter</item>
                <item name="string50" xsi:type="string">CyberSourceCoreGatewayString50Filter</item>
                <item name="string15" xsi:type="string">CyberSourceCoreGatewayString15Filter</item>
                <item name="string10" xsi:type="string">CyberSourceCoreGatewayString10Filter</item>
                <item name="alphanumstring60" xsi:type="string">CyberSourceCoreGatewayAlphaNumString60Filter</item>
                <item name="productName" xsi:type="string">CyberSourceCoreGatewayStringProductNameFilter</item>
            </argument>
        </arguments>
    </virtualType>

    <preference for="CyberSource\Core\StringUtils\FilterPoolInterface" type="CyberSourceCoreGatewayStringFilterPool"/>

    <virtualType name="CyberSourceCoreGatewayStringFilterRulePool" type="CyberSource\Core\StringUtils\RulePool">
        <arguments>
            <argument name="rules" xsi:type="array">
                <item name="firstName" xsi:type="string">string60</item>
                <item name="lastName" xsi:type="string">string60</item>
                <item name="company" xsi:type="string">alphanumstring60</item>
                <item name="phoneNumber" xsi:type="string">string15</item>
                <item name="postalCode" xsi:type="string">string10</item>
                <item name="street1" xsi:type="string">string60</item>
                <item name="street2" xsi:type="string">string60</item>
                <item name="city" xsi:type="string">string50</item>
                <item name="productName" xsi:type="string">productName</item>

                <item name="bill_to_forename" xsi:type="string">string60</item>
                <item name="bill_to_surname" xsi:type="string">string60</item>
                <item name="bill_to_company_name" xsi:type="string">alphanumstring60</item>
                <item name="bill_to_phone" xsi:type="string">string15</item>
                <item name="bill_to_address_line1" xsi:type="string">string60</item>
                <item name="bill_to_address_line2" xsi:type="string">string60</item>
                <item name="bill_to_address_city" xsi:type="string">string50</item>

                <item name="ship_to_forename" xsi:type="string">string60</item>
                <item name="ship_to_surname" xsi:type="string">string60</item>
                <item name="ship_to_company_name" xsi:type="string">alphanumstring60</item>
                <item name="ship_to_phone" xsi:type="string">string15</item>
                <item name="ship_to_address_line1" xsi:type="string">string60</item>
                <item name="ship_to_address_line2" xsi:type="string">string60</item>
                <item name="ship_to_address_city" xsi:type="string">string50</item>

                <item name="name" xsi:type="string">productName</item>
            </argument>
        </arguments>
    </virtualType>

    <preference for="CyberSource\Core\StringUtils\RulePoolInterface" type="CyberSourceCoreGatewayStringFilterRulePool"/>

    <type name="Magento\Framework\View\Asset\Minification">
        <plugin name="cybersource-core-minification-plugin" type="CyberSource\Core\Plugin\MinificationPlugin"/>
    </type>
</config>
