from aws_lambda_tools.common import openapi_json_serde
from conio_sdk_generated.openapi.v2.serde.models.success import Success
from requests import Response

from dist_v2.conio_sdk_generated.openapi.v2.serde.models.signin_response import SigninResponse
from test.integration.v2.base_integration_test import BaseV2IntegrationTest


class TestSignup(BaseV2IntegrationTest):
    def test(self):
        signup_message = self.create_signup_message()
        email = signup_message.conio_credentials.user_id
        physical_device_id = signup_message.device_id
        response: Response = self.post('signup', signup_message)
        access_token = response.headers['X-ConioAccessToken']
        refresh_token = response.headers['X-ConioRefreshToken']
        scope = response.headers['X-ConioTokenScope']
        self.assertTrue(access_token)
        self.assertTrue(refresh_token)
        self.assertEqual('create_wallet', scope)

        create_wallet_message = self.create_create_wallet_message()
        response: Response = self.post('create_wallet', create_wallet_message, auth_token=access_token)
        access_token = self._verify_response_tokens(response, 'confirm_email')
        self.confirm_email(email)
        response: Response = self.escalate_token(access_token, physical_device_id)
        self._verify_response_tokens(response, 'profile')
        response = self.login_email(
            signup_message.conio_credentials.user_id,
            signup_message.conio_credentials.password,
            signup_message.device_id,
            'profile'
        )
        signin_response: SigninResponse = openapi_json_serde.deserialize(response.content, SigninResponse)
        self.assertEqual(3600, signin_response.expires_in)
        self.assertTrue(signin_response.access_token)
        self.assertTrue(signin_response.refresh_token)

    def _verify_response_tokens(self, response: Response, expected_scope: str):
        access_token = response.headers['X-ConioAccessToken']
        refresh_token = response.headers['X-ConioRefreshToken']
        scope = response.headers['X-ConioTokenScope']
        self.assertTrue(access_token)
        self.assertTrue(refresh_token)
        self.assertEqual(expected_scope, scope)
        self.assertEqual('success', openapi_json_serde.deserialize(response.content, Success).status)
        return access_token
