security:
    password_hashers:
        App\Auth\Entity\User:
            algorithm: auto
        Symfony\Component\Security\Core\User\InMemoryUser:
            algorithm: bcrypt

    providers:
        app_user_provider:
            entity:
                class: App\Auth\Entity\User
                property: mobileNumber
        api_doc_provider:
            memory:
                users:
                    '%env(API_DOC_USERNAME)%':
                        password: '%env(API_DOC_PASSWORD)%'
                        roles: ['ROLE_ADMIN']

    firewalls:
        dev:
            pattern: ^/(_profiler|_wdt|assets|build)/
            security: false

        health:
            pattern: ^/health$
            security: false

        api_doc:
            pattern: ^/api/doc
            http_basic:
                realm: "ClinicPro API Documentation"
            provider: api_doc_provider

        # اسلات‌ها روی firewall با jwt هستند (نه این firewallِ بی‌احراز): همان اندپوینت
        # هم برای سایت عمومی (بدون توکن → ناشناس، توسط access_control با PUBLIC_ACCESS
        # مجاز) و هم برای پنل مدیریت (توکن معتبر → احراز می‌شود تا management=1 کار کند)
        # سرویس می‌دهد. برای همین از الگوی زیر خارج شده‌اند.
        public_endpoints:
            pattern: ^/(api/v1/altcha/(challenge|config)$|api/v1/user/(send-code|verify-code|register|otp-login|reset-password)|oauth/token$|session/token|api/v1/categorys/|api/v1/doctors$|api/v1/clinics$|api/v1/clinic/doctor-list/|api/v1/clinic/[^/]+/addresses$|api/v1/clinic-pro/doctor-addresses/|api/v1/appointment-booking-services/|api/v1/comments/|api/v1/rate/[^/]+$|api/v1/specialties|api/v1/blogs(/tags)?$|api/v1/tags$|api/v1/clinic-invitation/|api/v1/pre-registration$|api/v1/doctor/[^/]+/claim-info$)
            stateless: true
            security: false

        payment_callback:
            pattern: ^/api/v1/(payment/(callback|pay|order)/|subscription-payment/callback/)
            stateless: true
            security: false

        api:
            pattern: ^/(api|oauth|file/upload)/
            stateless: true
            provider: app_user_provider
            custom_authenticators:
                - App\Auth\Security\PasswordAuthenticator
            jwt: ~

    access_control:
        - { path: ^/health$,                               roles: PUBLIC_ACCESS }
        - { path: ^/api/doc,                               roles: ROLE_ADMIN }
        - { path: ^/api/v1/user/send-code,                 roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/user/verify-code,               roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/user/register,                  roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/user/login,                     roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/user/otp-login,                 roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/user/reset-password,            roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/appointment-slots,              roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/appointment-service-slots,      roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/appointment-booking-services/,  roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/appointment-booking-locations/, roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/appointment-settings/month-availability/, roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/comments/,                      roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/site-context$,                  methods: [GET], roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/specialties,                    methods: [GET], roles: PUBLIC_ACCESS }
        - path: '^/api/v1/rate/[^/]+$'
          methods: [GET]
          roles: PUBLIC_ACCESS
        - { path: ^/api/v1/blogs$,                         roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/blogs/tags$,                    methods: [GET], roles: PUBLIC_ACCESS }
        - path: '^/api/v1/blog/[^/]+$'
          methods: [GET]
          roles: PUBLIC_ACCESS
        - { path: ^/oauth/token$,                          roles: PUBLIC_ACCESS }
        - { path: ^/oauth/token/refresh$,                  roles: PUBLIC_ACCESS }
        - { path: ^/session/token,                         roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/payment/callback/,              roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/payment/pay/,                   roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/payment/order/,                 roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/subscription-payment/callback/, roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/categorys/,                     roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/doctors$,                       roles: PUBLIC_ACCESS }
        - path: '^/api/v1/doctor/[^/]+$'
          methods: [GET]
          roles: PUBLIC_ACCESS
        - { path: ^/api/v1/clinic/doctor-list/,            roles: PUBLIC_ACCESS }
        - { path: '^/api/v1/clinic/[^/]+/addresses$',      roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/clinic-pro/doctor-addresses/,   roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/clinics$,                       roles: PUBLIC_ACCESS }
        - path: '^/api/v1/clinic/[^/]+$'
          methods: [GET]
          roles: PUBLIC_ACCESS
        - { path: ^/api/v1/clinic-invitation/,             roles: PUBLIC_ACCESS }
        - { path: ^/api/v1/user/\d+$, methods: [DELETE],  roles: ROLE_ADMIN }
        - { path: ^/api,                                   roles: IS_AUTHENTICATED_FULLY }
        - { path: ^/oauth/userinfo,                        roles: IS_AUTHENTICATED_FULLY }
        - { path: ^/oauth/logout,                          roles: IS_AUTHENTICATED_FULLY }

when@test:
    security:
        password_hashers:
            App\Auth\Entity\User:
                algorithm: auto
                cost: 4
