<?xml version="1.0" encoding="UTF-8" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <parameters>
        <parameter key="payum.available_gateway_factories" type="collection" />
    </parameters>

    <services>
        <!-- Generic -->

        <service id="payum" alias="payum.static_registry" />

        <service id="payum.static_registry" class="Payum\Bundle\PayumBundle\Registry\ContainerAwareRegistry">
            <argument type="collection" /> <!-- gateways services. this should be replaced while container is built -->
            <argument type="collection" /> <!-- storages services. this should be replaced while container is built -->
            <argument type="collection" /> <!-- gateways factories services. this should be replaced while container is built -->

            <call method="setContainer">
                <argument type="service" id="service_container" />
            </call>
        </service>

        <service id="payum.gateway_factory" class="Payum\Bundle\PayumBundle\GatewayFactory">
            <argument type="collection" /> <!-- this should be replaced in compiler pass -->
            <argument type="collection" /> <!-- this should be replaced in compiler pass -->
            <argument type="collection" /> <!-- this should be replaced in compiler pass -->
            <call method="setContainer">
                <argument type="service" id="service_container" />
            </call>
        </service>

        <service id="payum.http_client" class="Payum\Core\HttpClientInterface">
            <factory class="Payum\Core\Bridge\Guzzle\HttpClientFactory" method="create" />
        </service>

        <service id="payum.guzzle_client" class="GuzzleHttp\ClientInterface">
            <factory class="Payum\Core\Bridge\Guzzle\HttpClientFactory" method="createGuzzle" />
        </service>

        <service id="payum.iso4217" class="Payum\ISO4217\ISO4217" />

        <service id="payum.converter.reply_to_http_response" class="Payum\Core\Bridge\Symfony\ReplyToSymfonyResponseConverter" />

        <service id="payum.listener.reply_to_http_response" class="Payum\Bundle\PayumBundle\EventListener\ReplyToHttpResponseListener">
            <argument type="service" id="payum.converter.reply_to_http_response" />

            <tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" priority="128" />
        </service>

        <!-- Extensions -->

        <service id="payum.extension.storage.prototype" class="Payum\Core\Extension\StorageExtension" abstract="true" public="false">
            <argument/> <!-- this should be replaced with real storage service -->
        </service>

        <service id="payum.extension.logger" class="Payum\Core\Bridge\Psr\Log\LoggerExtension">
            <argument type="service" id="logger" on-invalid="ignore" />

            <tag name="payum.extension" all="true" alias="psr_logger" />
        </service>

        <service id="payum.extension.token_factory" class="Payum\Core\Extension\GenericTokenFactoryExtension">
            <argument type="service" id="payum.security.token_factory" />

            <tag name="payum.extension" all="true" alias="token_factory" />
        </service>

        <!-- Actions -->

        <service id="payum.action.get_http_request" class="Payum\Core\Bridge\Symfony\Action\GetHttpRequestAction">
            <call method="setHttpRequest">
                <argument type="service" id="request" on-invalid="null" strict="false" />
            </call>

            <tag name="payum.action" all="true" alias="get_http_request" />
        </service>

        <service id="payum.action.obtain_credit_card" class="Payum\Core\Bridge\Symfony\Action\ObtainCreditCardAction">
            <argument type="service" id="form.factory" />
            <argument>%payum.template.obtain_credit_card%</argument>
            <call method="setRequest">
                <argument type="service" id="request" on-invalid="null" strict="false" />
            </call>

            <tag name="payum.action" all="true" alias="obtain_credit_card" />
        </service>
    </services>
</container>