#
# Copyright 2018-2020 NXP
# SPDX-License-Identifier: Apache-2.0
#
#

"""License text"""

import sys
import func_timeout
from sss.read_id_list import ReadIDList
from sss.se05x import Se05x
import sss.sss_api as apis
from .cli import se05x, pass_context, session_open, session_close, \
    log_traceback, TIME_OUT


@se05x.command('reset', short_help='Reset SE05X')
@pass_context
def reset(cli_ctx):
    """
    Resets the SE05X Secure Module to the initial state.

    This command uses ``Se05x_API_DeleteAll_Iterative`` API of the SE05X
    MW to iterately delete objects provisioned inside the SE.  Because of this,
    some objects are purposefully skipped from deletion.

    It does not use the low level SE05X API ``Se05x_API_DeleteAll``

    For more information, see documentation/implementation of the
    ``Se05x_API_DeleteAll_Iterative`` API.

    """
    try:
        session_open(cli_ctx)
        se05x_obj = Se05x(cli_ctx.session)
        func_timeout.func_timeout(TIME_OUT, se05x_obj.debug_reset, None)
        status = apis.kStatus_SSS_Success
    except func_timeout.FunctionTimedOut as timeout_exc:
        log_traceback(cli_ctx, timeout_exc.getMsg())
        status = apis.kStatus_SSS_Fail
    except Exception as exc:  # pylint: disable=broad-except
        log_traceback(cli_ctx, exc)
        status = apis.kStatus_SSS_Fail
    session_status = session_close(cli_ctx)
    if status == apis.kStatus_SSS_Success and session_status == apis.kStatus_SSS_Success:
        ret_value = 0
    else:
        ret_value = 1
    sys.exit(ret_value)


@se05x.command('uid', short_help='Get SE05X Unique ID (18 bytes)')
@pass_context
def uid(cli_ctx):
    """ Get 18 bytes Unique ID from the SE05X Secure Module."""
    try:
        session_open(cli_ctx)
        se05x_obj = Se05x(cli_ctx.session)
        unique_id = func_timeout.func_timeout(TIME_OUT, se05x_obj.get_unique_id, None)
        cli_ctx.log("Unique ID: %s" % (unique_id,))
        status = apis.kStatus_SSS_Success
    except func_timeout.FunctionTimedOut as timeout_exc:
        log_traceback(cli_ctx, timeout_exc.getMsg())
        status = apis.kStatus_SSS_Fail
    except Exception as exc:  # pylint: disable=broad-except
        log_traceback(cli_ctx, exc)
        status = apis.kStatus_SSS_Fail
    session_status = session_close(cli_ctx)
    if status == apis.kStatus_SSS_Success and session_status == apis.kStatus_SSS_Success:
        ret_value = 0
    else:
        ret_value = 1
    sys.exit(ret_value)


@se05x.command('certuid', short_help='Get SE05X Cert Unique ID (10 bytes)')
@pass_context
def certuid(cli_ctx):
    """ Get 10 bytes Cert Unique ID from the SE05X Secure Module.
    The cert uid is a subset of the Secure Module Unique Identifier"""
    try:
        session_open(cli_ctx)
        se05x_obj = Se05x(cli_ctx.session)
        cert_uid = func_timeout.func_timeout(TIME_OUT, se05x_obj.get_cert_unique_id, None)
        cli_ctx.log("Cert UID: %s" % (cert_uid,))
        status = apis.kStatus_SSS_Success
    except func_timeout.FunctionTimedOut as timeout_exc:
        log_traceback(cli_ctx, timeout_exc.getMsg())
        status = apis.kStatus_SSS_Fail
    except Exception as exc:  # pylint: disable=broad-except
        log_traceback(cli_ctx, exc)
        status = apis.kStatus_SSS_Fail
    session_status = session_close(cli_ctx)
    if status == apis.kStatus_SSS_Success and session_status == apis.kStatus_SSS_Success:
        ret_value = 0
    else:
        ret_value = 1
    sys.exit(ret_value)


@se05x.command('readidlist', short_help='Read contents of SE050')
@pass_context
def readidlist(cli_ctx):
    """ Read contents of SE050"""
    try:
        session_open(cli_ctx)
        read_id_list_obj = ReadIDList(cli_ctx.session)
        func_timeout.func_timeout(TIME_OUT, read_id_list_obj.do_read_id_list, None)
        status = apis.kStatus_SSS_Success
    except func_timeout.FunctionTimedOut as timeout_exc:
        log_traceback(cli_ctx, timeout_exc.getMsg())
        status = apis.kStatus_SSS_Fail
    except Exception as exc:  # pylint: disable=broad-except
        log_traceback(cli_ctx, exc)
        status = apis.kStatus_SSS_Fail
    session_status = session_close(cli_ctx)
    if status == apis.kStatus_SSS_Success and session_status == apis.kStatus_SSS_Success:
        ret_value = 0
    else:
        ret_value = 1
    sys.exit(ret_value)
