<?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.capture_path">payum_capture_do</parameter>
        <parameter key="payum.notify_path">payum_notify_do</parameter>
        <parameter key="payum.authorize_path">payum_authorize_do</parameter>
        <parameter key="payum.refund_path">payum_refund_do</parameter>
        <parameter key="payum.cancel_path">payum_cancel_do</parameter>
        <parameter key="payum.payout_path">payum_payout_do</parameter>
    </parameters>

    <services>
        <!-- Generic -->

        <defaults public="true" />

        <service id="payum.builder" class="Payum\Core\PayumBuilder">
            <call method="setMainRegistry">
                <argument type="service" id="payum.static_registry" />
            </call>
            <call method="setHttpRequestVerifier">
                <argument type="service" id="payum.http_request_verifier_builder" />
            </call>
            <call method="setTokenFactory">
                <argument type="service" id="payum.token_factory_builder" />
            </call>
            <call method="setTokenStorage">
                <argument type="service" id="payum.security.token_storage" />
            </call>
            <call method="setGenericTokenFactoryPaths">
                <argument type="collection">
                    <argument key="capture">%payum.capture_path%</argument>
                    <argument key="notify">%payum.notify_path%</argument>
                    <argument key="authorize">%payum.authorize_path%</argument>
                    <argument key="refund">%payum.refund_path%</argument>
                    <argument key="cancel">%payum.cancel_path%</argument>
                    <argument key="payout">%payum.payout_path%</argument>
                </argument>
            </call>
            <call method="setCoreGatewayFactory">
                <argument type="service" id="payum.core_gateway_factory_builder" />
            </call>
        </service>

        <service id="payum" class="Payum\Core\Payum">
            <factory service="payum.builder" method="getPayum" />
        </service>
        <service id="Payum\Core\Payum" alias="payum"></service>

        <service id="payum.static_registry" class="Payum\Core\Bridge\Symfony\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.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>

        <service id="payum.security.token_storage" abstract="true" />

        <!-- 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="monolog.logger" channel="payum"/>
            <tag name="payum.extension" all="true" alias="psr_logger" />
        </service>

        <!-- Builders -->
        <service id="payum.token_factory_builder" class="Payum\Core\Bridge\Symfony\Builder\TokenFactoryBuilder" public="false">
            <argument type="service" id="router" />
        </service>

        <service id="payum.http_request_verifier_builder" class="Payum\Core\Bridge\Symfony\Builder\HttpRequestVerifierBuilder" public="false" />

        <service id="payum.core_gateway_factory_builder" class="Payum\Core\Bridge\Symfony\Builder\CoreGatewayFactoryBuilder" public="false">
            <call method="setContainer">
                <argument type="service" id="service_container" />
            </call>
        </service>

        <service id="payum.action.obtain_credit_card_builder" class="Payum\Core\Bridge\Symfony\Builder\ObtainCreditCardActionBuilder">
            <argument type="service" id="form.factory" />
            <argument type="service" id="request_stack" />
        </service>

        <service id="payum.action.get_http_request" class="Payum\Core\Bridge\Symfony\Action\GetHttpRequestAction">
            <call method="setHttpRequestStack">
                <argument type="service" id="request_stack" />
            </call>
        </service>
    </services>
</container>
