import typing
from distutils.version import StrictVersion

from aws_lambda_tools.common import openapi_json_serde
from aws_lambda_tools.common.event import get_authorization_token
from aws_lambda_tools.common.response import Response, ResponseMimeType
from conio_sdk_generated.openapi.v2.serde.models.success import Success

from conio_sdk.services.conio.user.user_service import AuthenticationData

_DEFAULT_VERSION = StrictVersion('0.0.0')


def user_language(context) -> typing.Optional[str]:
    return context.headers_wrapper.get('User-Language')


def user_agent(context) -> typing.Optional[str]:
    return context.headers_wrapper.get('User-Agent')


def hardware_id(context) -> typing.Optional[str]:
    return context.headers_wrapper.get('X-ConioHardwareID')


def access_token(context) -> typing.Optional[str]:
    return get_authorization_token(context)


def app_version(context) -> StrictVersion:
    # noinspection PyBroadException
    try:
        header = context.headers_wrapper.get('versionname')

        return header and StrictVersion(header) or _DEFAULT_VERSION
    except Exception:
        return _DEFAULT_VERSION


def auth2resp(authentication_data: AuthenticationData) -> Response:
    response = Response(
        content=openapi_json_serde.serialize(Success('success')),
        content_type=ResponseMimeType.JSON
    )
    response.add_headers(
        {
            'X-ConioAccessToken': authentication_data.access_token,
            'X-ConioRefreshToken': authentication_data.refresh_token,
            'X-ConioTokenScope': authentication_data.current_scope
        }
    )
    return response
