security:
    enable_authenticator_manager: true

    #hide_user_not_found: false

    # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
    password_hashers:
        Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
        App\Entity\Users:
            algorithm: 'auto'

    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    providers:
        app_user_provider:
            entity:
                class: App\Entity\Users
                property: email

    firewalls:
        refresh:
            pattern:  ^/api/token/refresh
            stateless: true
            refresh_jwt: ~

        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        
        # login:
        #     pattern:  ^/api/login
        #     stateless: true
        #     entry_point: jwt
        #     json_login:
        #         check_path:                 /api/login_check # or api_login_check as defined in config/routes.yaml
        #         success_handler:            lexik_jwt_authentication.handler.authentication_success
        #         failure_handler:            lexik_jwt_authentication.handler.authentication_failure
        #         require_previous_session:   false
        #     jwt: ~
        #     #refresh_jwt: ~
        #     refresh_jwt:
        #         check_path: /api/token/refresh # or, you may use the `api_refresh_token` route name
        #     custom_authenticator: App\Security\AppAuthenticator
        #     logout:
        #         path: app_logout
        #         # where to redirect after logout
        #         # target: app_any_route


        login:
            pattern: ^/api/login
            stateless: true
            provider: app_user_provider
            json_login:
                check_path: /api/login_check # or api_login_check as defined in config/routes.yaml
                success_handler: lexik_jwt_authentication.handler.authentication_success
                failure_handler: lexik_jwt_authentication.handler.authentication_failure

        api:
            pattern:   ^/api
            stateless: true
            jwt: ~

        
        main:
            lazy: true
            provider: app_user_provider
            form_login:
                login_path: app_login
                check_path: app_login
                default_target_path: app_home
                enable_csrf: true
            login_throttling:
                max_attempts: 3
                interval: '15 minutes'
            logout:
                path: app_logout

            # activate different ways to authenticate
            # https://symfony.com/doc/current/security.html#firewalls-authentication

            # https://symfony.com/doc/current/security/impersonating_user.html
            # switch_user: true

    # Easy way to control access for large sections of your site
    # Note: Only the *first* access control that matches will be used
    access_control:
        - { path: ^/api/EM0622/documentation, roles: PUBLIC_ACCESS }
        #- { path: ^/api,       roles: IS_AUTHENTICATED_FULLY }
        - { path: ^/api/token/refresh, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/api/(login|token/refresh), roles: PUBLIC_ACCESS }
        - { path: ^/admin, roles: [ROLE_ADMIN] }
        - { path: ^/home, roles: [ROLE_ADMIN, ROLE_USER, ROLE_CBA] }
        - { path: ^/classes, roles: [ROLE_ADMIN, ROLE_USER, ROLE_CBA]}
        - { path: ^/contents, roles: [ROLE_ADMIN, ROLE_USER, ROLE_CBA] }
        - { path: ^/profil, roles: [ROLE_ADMIN, ROLE_USER, ROLE_CBA] }
        - { path: ^/teachers, roles: [ROLE_ADMIN, ROLE_TEACHER] }
        - { path: ^/list-events-free, roles: [ROLE_ADMIN, ROLE_TEACHER] }
        - { path: ^/list-events-pay, roles: [ROLE_ADMIN, ROLE_TEACHER] }

when@test:
    security:
        password_hashers:
            # By default, password hashers are resource intensive and take time. This is
            # important to generate secure password hashes. In tests however, secure hashes
            # are not important, waste resources and increase test times. The following
            # reduces the work factor to the lowest possible values.
            Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface:
                algorithm: auto
                cost: 4 # Lowest possible value for bcrypt
                time_cost: 3 # Lowest possible value for argon
                memory_cost: 10 # Lowest possible value for argon