---
apiVersion: v1
kind: ConfigMap
metadata:
  name: authentication
  namespace: flows
data:
  authentication.py: |
    import httpx

    from fastapi import Request, status
    from itsdangerous import URLSafeTimedSerializer, BadData as BadDataError
    from sqladmin.authentication import AuthenticationBackend

    from flow.config import settings


    class AdminAuthentication(AuthenticationBackend):
        def get_serializer(self) -> URLSafeTimedSerializer:
            return URLSafeTimedSerializer(
                secret_key=settings.admin_panel.secret_key,
            )

        async def login(self, request: Request) -> bool:
            form = await request.form()
            username, password = form["username"], form["password"]
            token_payload = {
                    'is_django_user': False,
                    'user_id': None,
                }
            # получаем данные о юзере
            if True:
                #print("OK"*30)
                # client: httpx.AsyncClient = settings.django.get_async_session(token=settings.django.token)
                # async with client as session:
                #     auth_response = await session.post(url='/login/', json={
                #         'username': username,
                #         'password': password,
                #     }, follow_redirects=False)
                #     print("*"*30, auth_response.status_code ,settings.django.host, username, password,"*"*30)
                #     if auth_response.status_code != status.HTTP_200_OK:
                #         return False

                    # django_response = await session.get(url='/client/settings/')
                    # print("$"*30, django_response.status_code, "$"*30)
                    # if django_response.status_code != status.HTTP_200_OK:
                    #     return False
                    if username == "68Lvh2PsHd5y" and password == "Hnzvh2PsHd5yI1v":
                        #user = django_response.json()
                        has_access = True
                        if not has_access:
                            return False

                        user_id = 2

                        token_payload = {
                            'is_django_user': True,
                            'user_id': user_id,
                        }
            else:
                token_payload = {
                    'is_django_user': False,
                    'user_id': None,
                }

            token = self.get_serializer().dumps(token_payload)

            request.session.update({"token": token})
            return True

        async def logout(self, request: Request) -> bool:
            request.session.clear()
            return True

        async def authenticate(self, request: Request) -> bool:
            token = request.session.get("token")

            if not token:
                return False

            try:
                payload = self.get_serializer().loads(token, max_age=settings.admin_panel.token_max_age)
            except (BadDataError, KeyError):
                return False

            is_django_user = payload.get('is_django_user')
            if settings.django.use != is_django_user:
                return False

            return True


    authentication_backend = AdminAuthentication(secret_key=settings.admin_panel.secret_key)
