<?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="api_platform.elasticsearch.name_converter.inner_fields" class="ApiPlatform\Elasticsearch\Serializer\NameConverter\InnerFieldsNameConverter" public="false">
            <argument type="service" id="api_platform.name_converter" on-invalid="ignore" />
        </service>

        <service id="api_platform.elasticsearch.normalizer.item" class="ApiPlatform\Elasticsearch\Serializer\ItemNormalizer" decorates="api_platform.serializer.normalizer.item" public="false">
            <argument type="service" id="api_platform.elasticsearch.normalizer.item.inner" />
        </service>

        <service id="api_platform.elasticsearch.normalizer.document" class="ApiPlatform\Elasticsearch\Serializer\DocumentNormalizer" public="false">
            <argument type="service" id="api_platform.metadata.resource.metadata_collection_factory" />
            <argument type="service" id="serializer.mapping.class_metadata_factory" />
            <argument type="service" id="api_platform.elasticsearch.name_converter.inner_fields" />
            <argument type="service" id="serializer.property_accessor" />
            <argument type="service" id="property_info" on-invalid="ignore" />
            <argument type="service" id="serializer.mapping.class_discriminator_resolver" on-invalid="ignore" />
            <argument>null</argument>
            <argument>%api_platform.serializer.default_context%</argument>

            <!-- Run after serializer.normalizer.data_uri but before serializer.normalizer.object -->
            <tag name="serializer.normalizer" priority="-922" />
        </service>

        <service id="api_platform.elasticsearch.request_body_search_extension.filter" public="false" abstract="true">
            <argument type="service" id="api_platform.filter_locator" />
        </service>

        <service id="api_platform.elasticsearch.request_body_search_extension.constant_score_filter" parent="api_platform.elasticsearch.request_body_search_extension.filter" class="ApiPlatform\Elasticsearch\Extension\ConstantScoreFilterExtension">
            <tag name="api_platform.elasticsearch.request_body_search_extension.collection" priority="30" />
        </service>

        <service id="api_platform.elasticsearch.request_body_search_extension.sort_filter" parent="api_platform.elasticsearch.request_body_search_extension.filter" class="ApiPlatform\Elasticsearch\Extension\SortFilterExtension">
            <tag name="api_platform.elasticsearch.request_body_search_extension.collection" priority="20" />
        </service>

        <service id="api_platform.elasticsearch.request_body_search_extension.sort" class="ApiPlatform\Elasticsearch\Extension\SortExtension" public="false">
            <argument type="service" id="api_platform.metadata.property.metadata_factory" />
            <argument type="service" id="api_platform.resource_class_resolver" />
            <argument type="service" id="api_platform.elasticsearch.name_converter.inner_fields" />
            <argument>%api_platform.collection.order%</argument>

            <tag name="api_platform.elasticsearch.request_body_search_extension.collection" priority="10" />
        </service>

        <service id="api_platform.elasticsearch.search_filter" public="false" abstract="true">
            <argument type="service" id="api_platform.metadata.property.name_collection_factory" />
            <argument type="service" id="api_platform.metadata.property.metadata_factory" />
            <argument type="service" id="api_platform.resource_class_resolver" />
            <argument type="service" id="api_platform.iri_converter" />
            <argument type="service" id="api_platform.property_accessor" />
            <argument type="service" id="api_platform.elasticsearch.name_converter.inner_fields" />
        </service>

        <service id="api_platform.elasticsearch.term_filter" class="ApiPlatform\Elasticsearch\Filter\TermFilter" parent="api_platform.elasticsearch.search_filter" public="false" abstract="true" />
        <service id="ApiPlatform\Elasticsearch\Filter\TermFilter" alias="api_platform.elasticsearch.term_filter" />

        <service id="api_platform.elasticsearch.match_filter" class="ApiPlatform\Elasticsearch\Filter\MatchFilter" parent="api_platform.elasticsearch.search_filter" public="false" abstract="true" />
        <service id="ApiPlatform\Elasticsearch\Filter\MatchFilter" alias="api_platform.elasticsearch.match_filter" />

        <service id="api_platform.elasticsearch.order_filter" class="ApiPlatform\Elasticsearch\Filter\OrderFilter" public="false" abstract="true">
            <argument type="service" id="api_platform.metadata.property.name_collection_factory" />
            <argument type="service" id="api_platform.metadata.property.metadata_factory" />
            <argument type="service" id="api_platform.resource_class_resolver" />
            <argument type="service" id="api_platform.elasticsearch.name_converter.inner_fields" />
            <argument>%api_platform.collection.order_parameter_name%</argument>
        </service>
        <service id="ApiPlatform\Elasticsearch\Filter\OrderFilter" alias="api_platform.elasticsearch.order_filter" />

        <service id="api_platform.elasticsearch.state.item_provider" class="ApiPlatform\Elasticsearch\State\ItemProvider" public="false">
            <argument type="service" id="api_platform.elasticsearch.client" />
            <argument type="service" id="api_platform.elasticsearch.metadata.document.metadata_factory" on-invalid="null" />
            <argument type="service" id="serializer" />
            <argument type="service" id="api_platform.inflector" on-invalid="null" />

            <tag name="api_platform.state_provider" priority="-100" key="ApiPlatform\Elasticsearch\State\ItemProvider"/>
            <tag name="api_platform.state_provider" priority="-100" />
        </service>
        <service id="ApiPlatform\Elasticsearch\State\ItemProvider" alias="api_platform.elasticsearch.state.item_provider"/>

        <service id="api_platform.elasticsearch.state.collection_provider" class="ApiPlatform\Elasticsearch\State\CollectionProvider" public="false">
            <argument type="service" id="api_platform.elasticsearch.client" />
            <argument type="service" id="api_platform.elasticsearch.metadata.document.metadata_factory" on-invalid="null" />
            <argument type="service" id="serializer" />
            <argument type="service" id="api_platform.pagination" />
            <argument type="tagged_iterator" tag="api_platform.elasticsearch.request_body_search_extension.collection" />
            <argument type="service" id="api_platform.inflector" on-invalid="null" />

            <tag name="api_platform.state_provider" priority="-100" key="ApiPlatform\Elasticsearch\State\CollectionProvider"/>
            <tag name="api_platform.state_provider" priority="-100" />
        </service>
        <service id="ApiPlatform\Elasticsearch\State\CollectionProvider" alias="api_platform.elasticsearch.state.collection_provider"/>

        <service id="api_platform.elasticsearch.metadata.resource.metadata_collection_factory" class="ApiPlatform\Elasticsearch\Metadata\Resource\Factory\ElasticsearchProviderResourceMetadataCollectionFactory" decorates="api_platform.metadata.resource.metadata_collection_factory" decoration-priority="40">
            <argument type="service" id="api_platform.elasticsearch.client_for_metadata" on-invalid="null" />
            <argument type="service" id="api_platform.elasticsearch.metadata.resource.metadata_collection_factory.inner" />
            <argument>false</argument>
            <argument type="service" id="api_platform.inflector" on-invalid="null" />
        </service>

    </services>

</container>
