import typing

from aws_lambda_tools.common.authenticator import AccessTokenValidationScope
from aws_lambda_tools.common.decorators import handle_session, aws_encode, json_encode, populate_user_from_event
from aws_lambda_tools.common.response import Response
from conio_sdk_generated.openapi.v2.serde.models.create_wallet import CreateWallet

from conio_sdk.common.decorators import log_this, manage_errors
from conio_sdk.context import AWS_CONTEXT
from sdk_functions.functions import access_token, auth2resp


@log_this
@handle_session(AWS_CONTEXT)
@populate_user_from_event(AWS_CONTEXT, scope=AccessTokenValidationScope.CREATE_WALLET)
@aws_encode()
@json_encode(message_type=CreateWallet)
@manage_errors
def create_wallet(msg: CreateWallet, event: typing.Dict, context=None) -> Response:
    from conio_sdk.ioc.vo.v2.create_wallet_ioc import create_wallet_service
    return auth2resp(create_wallet_service.create_wallet(
        msg, context.session_strategy.user, access_token(context),
        context.session_strategy.physical_device_id
    ))
