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

<config xmlns="http://thelia.net/schema/dic/config"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://thelia.net/schema/dic/config http://thelia.net/schema/dic/config/thelia-1.0.xsd">

    <parameters>
        <!--
        The list of Model classes which suppoorts image or document management.

        The key should have form type.parent, where type is the file type (document or image)
        and parent is the parent object of the file, form example product, brand, folder, etc.
        -->

        <parameter key="file_model.classes" type="collection">
            <parameter key="document.product">Thelia\Model\ProductDocument</parameter>
            <parameter key="image.product">Thelia\Model\ProductImage</parameter>

            <parameter key="document.category">Thelia\Model\CategoryDocument</parameter>
            <parameter key="image.category">Thelia\Model\CategoryImage</parameter>

            <parameter key="document.content">Thelia\Model\ContentDocument</parameter>
            <parameter key="image.content">Thelia\Model\ContentImage</parameter>

            <parameter key="document.folder">Thelia\Model\FolderDocument</parameter>
            <parameter key="image.folder">Thelia\Model\FolderImage</parameter>

            <parameter key="document.brand">Thelia\Model\BrandDocument</parameter>
            <parameter key="image.brand">Thelia\Model\BrandImage</parameter>

            <parameter key="image.module">Thelia\Model\ModuleImage</parameter>
        </parameter>

        <parameter key="admin.resources" type="collection">
            <parameter key="thelia" type="collection">
                <parameter key="SUPERADMINISTRATOR">SUPERADMINISTRATOR</parameter>
                <parameter key="ADDRESS">admin.address</parameter>
                <parameter key="ADMINISTRATOR">admin.configuration.administrator</parameter>
                <parameter key="ADVANCED_CONFIGURATION">admin.configuration.advanced</parameter>
                <parameter key="AREA">admin.configuration.area</parameter>
                <parameter key="ATTRIBUTE">admin.configuration.attribute</parameter>
                <parameter key="BRAND">admin.brand</parameter>
                <parameter key="CATEGORY">admin.category</parameter>
                <parameter key="CONFIG">admin.configuration"</parameter>
                <parameter key="CONTENT">admin.content</parameter>
                <parameter key="COUNTRY">admin.configuration.country</parameter>
                <parameter key="STATE">admin.configuration.state</parameter>
                <parameter key="COUPON">admin.coupon</parameter>
                <parameter key="CURRENCY">admin.configuration.currency</parameter>
                <parameter key="CUSTOMER">admin.customer</parameter>
                <parameter key="FEATURE">admin.configuration.feature</parameter>
                <parameter key="FOLDER">admin.folder</parameter>
                <parameter key="HOME">admin.home</parameter>
                <parameter key="LANGUAGE">admin.configuration.language</parameter>
                <parameter key="MAILING_SYSTEM">admin.configuration.mailing-system</parameter>
                <parameter key="MESSAGE">admin.configuration.message</parameter>
                <parameter key="MODULE">admin.module</parameter>
                <parameter key="HOOK">admin.hook</parameter>
                <parameter key="MODULE_HOOK">admin.module-hook</parameter>
                <parameter key="ORDER">admin.order</parameter>
                <parameter key="ORDER_STATUS">admin.configuration.order-status</parameter>
                <parameter key="PRODUCT">admin.product</parameter>
                <parameter key="PROFILE">admin.configuration.profile</parameter>
                <parameter key="SHIPPING_ZONE">admin.configuration.shipping-zone</parameter>
                <parameter key="TAX">admin.configuration.tax</parameter>
                <parameter key="TEMPLATE">admin.configuration.template</parameter>
                <parameter key="SYSTEM_LOG">admin.configuration.system-logs</parameter>
                <parameter key="ADMIN_LOG">admin.configuration.admin-logs</parameter>
                <parameter key="STORE">admin.configuration.store</parameter>
                <parameter key="TRANSLATIONS">admin.configuration.translations</parameter>
                <parameter key="UPDATE">admin.configuration.update</parameter>
                <parameter key="EXPORT">admin.export</parameter>
                <parameter key="IMPORT">admin.import</parameter>
                <parameter key="TOOLS">admin.tools</parameter>
                <parameter key="SALES">admin.sales</parameter>
                <parameter key="TITLE">admin.customer.title</parameter>
            </parameter>
        </parameter>

        <parameter key="import.base_url">/admin/import</parameter>
        <parameter key="export.base_url">/admin/export</parameter>

        <parameter key="thelia.token_id">thelia.token_provider</parameter>
        <parameter key="thelia.validator.translation_domain">validators</parameter>

        <!-- Thelia logger class -->
        <parameter key="thelia.logger.class">Thelia\Log\Tlog</parameter>

        <!-- Thelia Cache Config -->
        <parameter key="thelia.cache.namespace">thelia_cache</parameter>
    </parameters>

    <services>
        <service id="Symfony\Component\DependencyInjection\ContainerInterface" alias="service_container"/>
        <service id="Psr\Container\ContainerInterface" alias="service_container"/>

        <!-- Thelia template helper -->
        <service id="thelia.template_helper" class="Thelia\Core\Template\TheliaTemplateHelper" public="true">
          <argument>%kernel.cache_dir%</argument>
        </service>

        <!--  URL maganement -->
        <service id="Thelia\Tools\URL" >
            <argument type="service" id="router.admin" />
        </service>
        <service id="thelia.url.manager" alias="Thelia\Tools\URL" public="true"/>


        <!-- Tax engine -->
        <service id="thelia.taxEngine" alias="Thelia\TaxEngine\TaxEngine"/>

        <!--  The assets manager -->
        <service id="assetic.asset.manager" alias="Thelia\Core\Template\Assets\AsseticAssetManager" public="true"/>

        <!-- The asset filters -->
        <service id="Thelia\Core\Template\Assets\Filter\LessDotPhpFilter">
            <tag name="thelia.asset.filter" key="less" />
            <tag name="kernel.event_subscriber"/>
            <argument>%kernel.environment%</argument>
        </service>
        <service id="less.assetic.filter" alias="Thelia\Core\Template\Assets\Filter\LessDotPhpFilter"/>

        <service id="Assetic\Filter\ScssphpFilter">
            <tag name="thelia.asset.filter" key="scss"  />
        </service>
        <service id="scss.assetic.filter" alias="Assetic\Filter\ScssphpFilter"/>

        <service id="Assetic\Filter\PhpCssEmbedFilter">
            <tag name="thelia.asset.filter" key="cssembed" />
        </service>
        <service id="cssembed.assetic.filter" alias="Assetic\Filter\PhpCssEmbedFilter"/>

        <service id="Assetic\Filter\CssRewriteFilter">
            <tag name="thelia.asset.filter" key="cssrewrite"/>
        </service>
        <service id="cssrewrite.assetic.filter" alias="Assetic\Filter\CssRewriteFilter"/>

        <service id="Assetic\Filter\CssImportFilter">
            <tag name="thelia.asset.filter" key="cssimport"/>
        </service>
        <service id="cssimport.assetic.filter" alias="Assetic\Filter\CssImportFilter"/>

        <!--
        A ControllerResolver that supports "a:b:c", "service:method" and class::method" notations,
        thus allowing the definition of controllers as service (see http://symfony.com/fr/doc/current/cookbook/controller/service.html)
        We use it here to inject the service container in the admin base controller.
        -->
        <service id="Thelia\Core\Controller\ControllerResolver">
            <argument type="service" id="service_container"/>
        </service>
        <service id="controller_resolver" alias="Thelia\Core\Controller\ControllerResolver"/>
        <service id="Symfony\Component\HttpKernel\Controller\ControllerResolverInterface" alias="Thelia\Core\Controller\ControllerResolver"/>

        <!--  Translation and internationalisation -->

<!--        <service id="Thelia\Core\Translation\Translator" public="true"/>-->
        <service id="Symfony\Contracts\Translation\TranslatorInterface" alias="Thelia\Core\Translation\Translator" />
        <service id="thelia.translator" alias="Thelia\Core\Translation\Translator" />

        <!--  Hook Helper -->

        <service id="thelia.hookHelper" alias="Thelia\Core\Hook\HookHelper" />

        <!-- Security context for front and back office -->
        <service id="thelia.securityContext" alias="Thelia\Core\Security\SecurityContext" public="true"/>


        <service id="thelia.parser.context" alias="Thelia\Core\Template\ParserContext" public="true"/>

        <!-- The file manager -->
        <service id="Thelia\Files\FileManager">
            <argument>%file_model.classes%</argument>
        </service>
        <service id="thelia.file_manager" alias="Thelia\Files\FileManager"/>

        <service id="base_http_kernel" alias="Thelia\Core\TheliaHttpKernel" public="true"/>
        <service id="http_kernel" alias="Thelia\Core\TheliaHttpKernel" public="true"/>

        <service id="argument_metadata_factory" class="Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory" />

        <service id="argument_resolver" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver">
            <argument type="service" id="argument_metadata_factory" />
            <argument type="collection" /> <!-- argument value resolvers -->
        </service>
        <service id="Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface" alias="argument_resolver"/>

        <service id="argument_resolver.request_attribute" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver">
          <tag name="controller.argument_value_resolver" priority="100" />
        </service>

        <service id="argument_resolver.request" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver">
          <tag name="controller.argument_value_resolver" priority="50" />
        </service>

        <service id="argument_resolver.session" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\SessionValueResolver">
          <tag name="controller.argument_value_resolver" priority="50" />
        </service>

        <service id="argument_resolver.service" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\ServiceValueResolver">
          <tag name="controller.argument_value_resolver" priority="-50" />
          <argument />
        </service>

<!--       Todo check is these resolver is needed-->
        <service id="argument_resolver.default" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver">
          <tag name="controller.argument_value_resolver" priority="-100" />
        </service>

        <service id="argument_resolver.variadic" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver">
          <tag name="controller.argument_value_resolver" priority="-150" />
        </service>
<!--      end todo-->


        <service id="request" alias="Thelia\Core\HttpFoundation\Request" />

        <service id="mailer" alias="Thelia\Mailer\MailerFactory"/>

        <service id="response.listener" alias="Thelia\Core\EventListener\ResponseListener"/>

        <service id="session.listener" alias="Thelia\Core\EventListener\SessionListener"/>

        <service id="controller.listener" alias="Thelia\Core\EventListener\ControllerListener"/>

        <service id="error.listener" alias="Thelia\Core\EventListener\ErrorListener" />

        <!-- Serializers -->
        <service id="Thelia\Core\Serializer\SerializerManager" public="true"/>
        <service id="thelia.serializer.manager" alias="Thelia\Core\Serializer\SerializerManager" public="true" />
        <service id="thelia.serializer.csv" alias="Thelia\Core\Serializer\Serializer\CSVSerializer"/>
        <service id="thelia.serializer.xml" alias="Thelia\Core\Serializer\Serializer\XMLSerializer"/>
        <service id="thelia.serializer.json" alias="Thelia\Core\Serializer\Serializer\JSONSerializer"/>

        <!-- Archivers -->
        <service id="Thelia\Core\Archiver\ArchiverManager" public="true"/>
        <service id="thelia.archiver.manager" alias="Thelia\Core\Archiver\ArchiverManager" public="true"/>
        <service id="thelia.archiver.zip" alias="Thelia\Core\Archiver\Archiver\ZipArchiver"/>
        <service id="thelia.archiver.tar" alias="Thelia\Core\Archiver\Archiver\TarArchiver"/>
        <service id="thelia.archiver.tgz" alias="Thelia\Core\Archiver\Archiver\TarGzArchiver"/>
        <service id="thelia.archiver.bz2" alias="Thelia\Core\Archiver\Archiver\TarBz2Archiver"/>

        <!-- Thelia simple token provider -->
        <service id="Thelia\Tools\TokenProvider">
            <argument type="service" id="request_stack" />
            <argument type="service" id="thelia.translator" />
            <argument>%thelia.token_id%</argument>
        </service>
        <service id="thelia.token_provider" alias="Thelia\Tools\TokenProvider"/>

        <!-- Forms services ( factory builder, Thelia form types ) -->
        <service id="Symfony\Component\Validator\ValidatorBuilder">
            <call method="setTranslationDomain">
                <argument>%thelia.validator.translation_domain%</argument>
            </call>
            <call method="setTranslator">
                <argument type="service" id="thelia.translator" />
            </call>
        </service>
        <service id="thelia.forms.validator_builder" alias="Symfony\Component\Validator\ValidatorBuilder"/>

        <service id="Symfony\Component\Form\FormFactoryBuilderInterface" class="Symfony\Component\Form\FormFactoryBuilder" />
        <service id="thelia.form_factory_builder" alias="Symfony\Component\Form\FormFactoryBuilderInterface" />

        <service id="Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension" class="Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension"/>
        <service id="thelia.forms.extension.http_foundation_extension" alias="Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension"/>

        <service id="Symfony\Component\Form\Extension\Core\CoreExtension" class="Symfony\Component\Form\Extension\Core\CoreExtension"/>
        <service id="thelia.forms.extension.core_extension" alias="Symfony\Component\Form\Extension\Core\CoreExtension"/>

        <service id="thelia.form_factory" alias="Thelia\Core\Form\TheliaFormFactory" public="true"/>

        <service id="thelia.form_validator" alias="Thelia\Core\Form\TheliaFormValidator" public="true"/>

        <service id="currency.converter" class="Thelia\CurrencyConverter\CurrencyConverter" />
        <service id="Thelia\CurrencyConverter\CurrencyConverter" alias="currency.converter" />

        <service id="currency.converter.ecbProvider" class="Thelia\CurrencyConverter\Provider\ECBProvider">
            <tag name="currency.converter.provider" priority="0" />
        </service>

        <!-- Thelia logger -->
        <service factory="%thelia.logger.class%::getInstance" id="thelia.logger" class="%thelia.logger.class%" />

        <!-- The AdminRessources manager -->
        <service id="thelia.admin.resources" class="Thelia\Core\Security\Resource\AdminResources" public="true">
            <argument>%admin.resources%</argument>
        </service>

        <!-- Handlers -->
        <service id="thelia.export.handler" alias="Thelia\Handler\ExportHandler" public="true"/>
        <service id="thelia.import.handler" alias="Thelia\Handler\ImportHandler" public="true"/>

        <!-- Cache -->
        <service id="Symfony\Component\Cache\Adapter\AdapterInterface" class="Symfony\Component\Cache\Adapter\FilesystemAdapter" public="true">
            <argument>%thelia.cache.namespace%</argument>
            <argument>600</argument>
            <argument>%kernel.cache_dir%</argument>
        </service>
        <service id="thelia.cache" alias="Symfony\Component\Cache\Adapter\AdapterInterface" public="true"/>

        <service id="Symfony\WebpackEncoreBundle\Asset\TagRenderer" alias="webpack_encore.tag_renderer" public="true"/>
        <service id="Symfony\WebpackEncoreBundle\Asset\EntrypointLookupInterface" alias="webpack_encore.entrypoint_lookup_collection" public="true"/>
    </services>
</config>
