# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
    locale: en
    app_locales: ar|cs|de|de_CH|da|en|eo|es|eu|fr|he|hu|it|ja|ko|nl|pl|pt_BR|ro|ru|sk|sv|tr|vi|zh_CN

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        public: false       # Allows optimizing the container by removing unused services; this also means
                            # fetching services directly from the container via $container->get() won't work.
                            # The best practice is to be explicit about your dependencies anyway.
        bind:
            $projectDirectory: '%kernel.project_dir%'
            $kernelEnvironment: '%kernel.environment%'

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php,Constants.php}'

    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

    # ================================================================================
    # APPLICATION CORE
    # ================================================================================

    App\EventSubscriber\RedirectToLocaleSubscriber:
        arguments: ['@router', '%app_locales%', '%locale%']

    App\Repository\WidgetRepository:
        arguments:
            $widgets: '%kimai.widgets%'

    App\Controller\DashboardController:
        arguments:
            $dashboard: '%kimai.dashboard%'

    App\Configuration\MailConfiguration:
        arguments: ['%env(MAILER_FROM)%']

    App\Configuration\LanguageFormattings:
        arguments: ['%kimai.languages%']

    App\Configuration\TimesheetConfiguration:
        arguments:
            $settings: '%kimai.timesheet%'

    App\Configuration\CalendarConfiguration:
        arguments:
            $settings: '%kimai.calendar%'

    App\Configuration\FormConfiguration:
        arguments:
            $settings: '%kimai.defaults%'

    App\Configuration\SystemConfiguration:
        arguments:
            $settings: '%kimai.config%'

    App\Configuration\ThemeConfiguration:
        arguments:
            $settings: '%kimai.theme%'

    App\Configuration\LdapConfiguration:
        arguments: ['%kimai.ldap%']

    App\Utils\MPdfConverter:
        arguments: ['%kernel.cache_dir%']

    App\Plugin\PluginManager:
        arguments: [!tagged kimai.plugin]

    App\Validator\Constraints\TimesheetValidator:
        arguments: [!tagged timesheet.validator]

    App\Widget\WidgetService:
        arguments:
            $renderer: !tagged widget.renderer

    App\Utils\Translator:
        decorates: translator
        arguments:
            $localDomains: '%kimai.i18n_domains%'

    App\Utils\FileHelper:
        arguments:
            $dataDir: '%kimai.data_dir%'

    # ================================================================================
    # DATABASE
    # ================================================================================

    # updates timesheet records and apply configured rate & rounding rules
    App\Doctrine\TimesheetSubscriber:
        class: App\Doctrine\TimesheetSubscriber
        arguments: [!tagged timesheet.calculator]
        tags:
            - { name: doctrine.event_subscriber, priority: 50 }

    # updates timestampable columns (higher priority, so the TimesheetSubscriber will be executed later)
    Gedmo\Timestampable\TimestampableListener:
        class: Gedmo\Timestampable\TimestampableListener
        tags:
            - { name: doctrine.event_subscriber, priority: 60 }
        calls:
            - [ setAnnotationReader, [ "@annotation_reader" ] ]

    # make sure, that sqlite supports foreign keys and cascade deletes
    App\Doctrine\SqliteSessionInitSubscriber:
        class: App\Doctrine\SqliteSessionInitSubscriber
        tags:
            - { name: doctrine.event_listener, event: postConnect }

    # store and retrieve sessions in and from database
    App\Security\SessionHandler:
        arguments:
            - !service { class: PDO, factory: ['@database_connection', 'getWrappedConnection'] }

    # ================================================================================
    # FORMS
    # ================================================================================

    App\Form\Type\LanguageType:
        arguments: ['%app_locales%']

    # ================================================================================
    # THEME
    # ================================================================================

    KevinPapst\AdminLTEBundle\Helper\ContextHelper:
        alias: admin_lte_theme.context_helper

    # ================================================================================
    # TIMESHEET RECORD CALCULATOR
    # ================================================================================

    App\Timesheet\RoundingService:
        arguments:
            $roundingModes: !tagged timesheet.rounding_mode
            $rules: '%kimai.timesheet.rounding%'

    App\Timesheet\Calculator\RateCalculator:
        arguments: ['%kimai.timesheet.rates%']

    App\Timesheet\TrackingModeService:
        arguments: 
            $modes: !tagged timesheet.tracking_mode

    # ================================================================================
    # SECURITY & VOTER
    # ================================================================================

    App\Security\RoleService:
        arguments:
            $roles: '%security.role_hierarchy.roles%'

    App\Security\RolePermissionManager:
        arguments:
            $permissions: '%kimai.permissions%'

    # ================================================================================
    # LDAP
    # ================================================================================

    App\Ldap\LdapAuthenticationProvider:
        arguments: ['@App\Security\UserChecker', '', '', '', '@App\Configuration\LdapConfiguration', '%security.authentication.hide_user_not_found%']

    # ================================================================================
    # REPOSITORIES
    # ================================================================================

    App\Repository\TimesheetRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\Timesheet']

    App\Repository\UserRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\User']

    App\Repository\TeamRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\Team']

    App\Repository\ActivityRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\Activity']

    App\Repository\ProjectRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\Project']

    App\Repository\TagRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\Tag']

    App\Repository\CustomerRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\Customer']

    App\Repository\InvoiceTemplateRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\InvoiceTemplate']

    App\Repository\ConfigurationRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\Configuration']

    App\Repository\RoleRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\Role']

    App\Repository\RolePermissionRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\RolePermission']
    
    App\Repository\InvoiceDocumentRepository:
        class: App\Repository\InvoiceDocumentRepository
        arguments: ['%kimai.invoice.documents%']

    App\Repository\CustomerRateRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\CustomerRate']

    App\Repository\ActivityRateRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\ActivityRate']

    App\Repository\ProjectRateRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\ProjectRate']

    App\Repository\InvoiceRepository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ['@doctrine.orm.entity_manager', getRepository]
        arguments: ['App\Entity\Invoice']
