<?xml version="1.0" ?>

<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"
>
    <services>

        <service
            id="symfony_generics.controller_helper"
            class="Addiks\SymfonyGenerics\Controllers\DefaultControllerHelper"
        >
            <argument type="service" id="doctrine.orm.entity_manager" />
            <argument type="service" id="twig" />
            <argument type="service" id="security.token_storage" />
            <argument type="service" id="security.access.decision_manager" />
            <argument type="service" id="router" />
            <argument type="service" id="logger" />
            <argument type="service" id="event_dispatcher" />
            <argument type="service" id="request_stack" />
        </service>

        <service
            id="symfony_generics.argument_factory"
            class="Addiks\SymfonyGenerics\Arguments\ArgumentFactory\ArgumentFactoryAggregate"
            public="true"
        >
            <argument type="collection">
                <argument type="service">
                    <service
                        class="Addiks\SymfonyGenerics\Arguments\ArgumentFactory\ArgumentCallFactory"
                        id="symfony_generics.argument_factory.call"
                    >
                        <argument type="service" id="symfony_generics.argument_compiler" />
                        <argument type="service" id="symfony_generics.argument_factory.lazy_load_proxy" />
                    </service>
                </argument>
                <argument type="service">
                    <service
                        class="Addiks\SymfonyGenerics\Arguments\ArgumentFactory\ServiceArgumentFactory"
                        id="symfony_generics.argument_factory.service"
                    >
                        <argument type="service" id="service_container" />
                    </service>
                </argument>
                <argument type="service">
                    <service
                        class="Addiks\SymfonyGenerics\Arguments\ArgumentFactory\AdditionalDataArgumentFactory"
                        id="symfony_generics.argument_factory.additional_data"
                    >
                        <argument type="service" id="symfony_generics.argument_factory.context" />
                    </service>
                </argument>
                <argument type="service">
                    <service
                        class="Addiks\SymfonyGenerics\Arguments\ArgumentFactory\EntityArgumentFactory"
                        id="symfony_generics.argument_factory.entity"
                    >
                        <argument type="service" id="doctrine.orm.entity_manager" />
                        <argument type="service" id="symfony_generics.argument_factory.lazy_load_proxy" />
                    </service>
                </argument>
                <argument type="service">
                    <service
                        class="Addiks\SymfonyGenerics\Arguments\ArgumentFactory\RequestArgumentFactory"
                        id="symfony_generics.argument_factory.request"
                    >
                        <argument type="service" id="request_stack" />
                    </service>
                </argument>
                <argument type="service">
                    <service
                        class="Addiks\SymfonyGenerics\Arguments\ArgumentFactory\RequestFileArgumentFactory"
                        id="symfony_generics.argument_factory.request_file"
                    >
                        <argument type="service" id="request_stack" />
                    </service>
                </argument>
                <argument type="service">
                    <service
                        class="Addiks\SymfonyGenerics\Arguments\ArgumentFactory\RequestPayloadArgumentFactory"
                        id="symfony_generics.argument_factory.request_payload"
                    >
                        <argument type="service" id="request_stack" />
                    </service>
                </argument>
                <argument type="service">
                    <service
                        class="Addiks\SymfonyGenerics\Arguments\ArgumentFactory\LiteralArgumentFactory"
                        id="symfony_generics.argument_factory.literal"
                    />
                </argument>
            </argument>
        </service>

        <service
            id="symfony_generics.argument_factory.lazy_load_proxy"
            class="Addiks\SymfonyGenerics\Arguments\ArgumentFactory\ArgumentFactoryLazyLoadProxy"
        >
            <argument type="service" id="service_container" />
            <argument>symfony_generics.argument_factory</argument>
        </service>

        <service
            id="symfony_generics.argument_factory.context"
            class="Addiks\SymfonyGenerics\Arguments\ArgumentContext"
        />

        <service
            id="symfony_generics.argument_compiler"
            class="Addiks\SymfonyGenerics\Services\ArgumentCompiler"
        >
            <argument type="service" id="symfony_generics.argument_factory.lazy_load_proxy" />
            <argument type="service" id="request_stack" />
            <argument type="service" id="symfony_generics.argument_factory.context" />
            <argument type="service" id="symfony_generics.controller_helper" />
        </service>

        <service
            id="symfony_generics.controller.error_handler.default"
            class="Addiks\SymfonyGenerics\Controllers\GenericExceptionResponseController"
        >
            <tag name="symfony_generics.error_handler" key="default" success_flash_message="" />
            <argument type="service" id="symfony_generics.controller_helper" />
            <argument type="service" id="symfony_generics.argument_compiler" />
            <argument type="collection">
                <argument
                    key="inner-controller"
                    type="service"
                    id="symfony_generics.controller.error_handler.default.inner"
                />
                <argument key="success-flash-message">success_flash_message</argument>
                <argument key="exception-responses" type="collection">
                    <argument key="Exception" type="collection">
                        <argument key="flash-type">danger</argument>
                        <argument key="code">307</argument>
                        <argument key="redirect-route">error_route</argument>
                    </argument>
                </argument>
            </argument>
        </service>

        <service
            id="symfony_generics.entity_locator"
            class="Addiks\SymfonyGenerics\Repositories\EntityLocatorClass"
        >
            <argument type="service" id="request_stack" />
            <argument type="service" id="doctrine.orm.entity_manager" />
        </service>

        <service
            id="symfony_generics.validatables.collection"
            class="Addiks\SymfonyGenerics\Collection\CollectionOfValidatables"
            public="true"
        >
            <argument type="collection"></argument>
        </service>

        <service
            id="symfony_generics.voter.ownership.owns"
            class="Addiks\SymfonyGenerics\Voter\OwnershipVoter"
        >
            <argument type="service" id="security.helper" />
            <argument>OWNS</argument>
            <tag name="security.voter" />
        </service>

        <service
            id="symfony_generics.voter.ownership.can_read"
            class="Addiks\SymfonyGenerics\Voter\OwnershipVoter"
        >
            <argument type="service" id="security.helper" />
            <argument>CAN_READ</argument>
            <tag name="security.voter" />
        </service>

        <service
            id="symfony_generics.voter.ownership.can_write"
            class="Addiks\SymfonyGenerics\Voter\OwnershipVoter"
        >
            <argument type="service" id="security.helper" />
            <argument>CAN_WRITE</argument>
            <tag name="security.voter" />
        </service>

        <service
            id="symfony_generics.voter.ownership.can_delete"
            class="Addiks\SymfonyGenerics\Voter\OwnershipVoter"
        >
            <argument type="service" id="security.helper" />
            <argument>CAN_DELETE</argument>
            <tag name="security.voter" />
        </service>
        
        <service
            id="symfony_generics.routing.loader.by_tag"
            class="Addiks\SymfonyGenerics\Routing\RoutingLoaderDecorator"
            decorates="routing.loader"
        >
            <argument type="service" id="symfony_generics.routing.loader.by_tag.inner" />
        </service>

    </services>
</container>
