<?xml version="1.0"?>
<!--
/**
 * Copyright © Klarna Bank AB (publ)
 *
 * For the full copyright and license information, please view the NOTICE
 * and LICENSE files that were distributed with this source code.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <virtualType name="KpKlarnaConfig" type="Klarna\Base\Helper\KlarnaConfig">
        <arguments>
            <argument name="eventPrefix" xsi:type="string">kp</argument>
        </arguments>
    </virtualType>

    <type name="Klarna\Kp\Model\Api\Rest\Service\Payments">
        <arguments>
            <argument name="klarnaConfig" xsi:type="object">Klarna\Base\Helper\KlarnaConfig\Proxy</argument>
        </arguments>
    </type>

    <type name="Klarna\Kp\Plugin\Payment\Helper\DataPlugin">
        <arguments>
            <argument name="quoteProvider" xsi:type="object">Klarna\Kp\Model\QuoteProvider\CachingQuoteProvider</argument>
        </arguments>
    </type>

    <type name="Klarna\Kp\Model\QuoteProvider\CachingQuoteProvider">
        <arguments>
            <argument name="quoteProviders" xsi:type="array">
                <item name="first" xsi:type="object">Klarna\Kp\Model\QuoteProvider\PersistenceAwareQuoteProvider</item>
                <item name="second" xsi:type="object">Klarna\Kp\Model\QuoteProvider\SessionAwareQuoteProvider</item>
            </argument>
        </arguments>
    </type>

    <!-- Payment Method configuration -->
    <type name="Klarna\Kp\Model\Payment\Kp">
        <arguments>
            <argument name="adapter" xsi:type="object">KPVirtual</argument>
        </arguments>
    </type>

    <type name="Klarna\Kp\Model\Session">
        <arguments>
            <argument name="builder" xsi:type="object">Klarna\Kp\Model\Api\Builder\Kasper</argument>
        </arguments>
    </type>

    <type name="Klarna\Kp\Model\Placement\Api">
        <arguments>
            <argument name="builder" xsi:type="object">Klarna\Kp\Model\Api\Builder\Kasper</argument>
        </arguments>
    </type>

    <virtualType name="KPVirtual" type="Magento\Payment\Model\Method\Adapter">
        <arguments>
            <argument name="code" xsi:type="const">Klarna\Kp\Model\Payment\Kp::METHOD_CODE</argument>
            <argument name="valueHandlerPool" xsi:type="object">KPValueHandlerPool</argument>
            <argument name="commandPool" xsi:type="object">KPCommandPool</argument>
            <argument name="validatorPool" xsi:type="object">KPValidatorPool</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Klarna\Base\Block\Info\Klarna</argument>
        </arguments>
    </virtualType>

    <virtualType name="KPCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">KPConfig</argument>
        </arguments>
    </virtualType>

    <virtualType name="KPValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">KPCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="KPCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="authorize" xsi:type="string">Klarna\Kp\Gateway\Command\Authorize</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="KPConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Klarna\Kp\Model\Payment\Kp::METHOD_CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="KPConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">KPConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="KPValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="title" xsi:type="string">Klarna\Kp\Gateway\Handler\TitleHandler</item>
                <item name="default" xsi:type="string">KPConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <type name="Magento\Payment\Helper\Data">
        <plugin sortOrder="10" name="klarnaKpPaymentData" type="Klarna\Kp\Plugin\Payment\Helper\DataPlugin"/>
    </type>
    <type name="Magento\AdvancedSalesRule\Model\Rule\Condition\FilterTextGenerator\Address\PaymentMethod">
        <plugin sortOrder="10" name="klarnaKpPaymentMethod" type="Klarna\Kp\Plugin\Model\PaymentMethodPlugin"/>
    </type>
    <type name="Magento\SalesRule\Model\Rule\Condition\Address">
        <plugin sortOrder="10" name="klarnaKpAddressCondition" type="Klarna\Kp\Plugin\Model\AddressConditionPlugin"/>
    </type>
    <type name="Magento\SalesRule\Model\Quote\Discount">
        <plugin sortOrder="10" name="klarnaKpDiscount" type="Klarna\Kp\Plugin\Model\Quote\DiscountPlugin"/>
    </type>
    <type name="Klarna\Base\Helper\VersionInfo">
        <plugin
            sortOrder="10"
            name="klarnaKpVersionInfo"
            type="Klarna\Kp\Plugin\Helper\VersionInfoPlugin"
        />
    </type>

    <type name="Klarna\Kp\Model\Placement\OrderUpdate">
        <arguments>
            <argument name="orderManagementApi" xsi:type="object">Klarna\Backend\Model\Api\OrderManagement</argument>
        </arguments>
    </type>

    <preference for="Klarna\Kp\Api\QuoteInterface" type="Klarna\Kp\Model\Quote"/>
    <preference for="Klarna\Kp\Api\QuoteRepositoryInterface" type="Klarna\Kp\Model\QuoteRepository"/>
    <preference for="Klarna\Kp\Api\CreditApiInterface" type="Klarna\Kp\Model\Api\Rest\Service\Payments"/>
</config>
