#
# Copyright 2019,2020 NXP
# SPDX-License-Identifier: Apache-2.0
#
#

"""License text"""

import sys
import click
import func_timeout
from sss.refkey import RefPem
import sss.sss_api as apis
from .cli import refpem, pass_context, session_open, session_close, \
    log_traceback, TIME_OUT, TIME_OUT_RSA


@refpem.group()
@pass_context
def ecc(cli_ctx):
    """Refpem ECC Keys"""
    cli_ctx.vlog("Refpem ECC Keys")


@refpem.group()
@pass_context
def rsa(cli_ctx):
    """Refpem RSA Keys"""
    cli_ctx.vlog("Refpem RSA Keys")


@ecc.command('pair', short_help='Create reference PEM file for ECC Pair')
@click.argument('keyid', type=str, metavar='keyid')
@click.argument('filename', type=str, metavar='filename')
@click.option('--format', default='',
              help="Output file format. TEXT can be \"DER\" or \"PEM\" or \"PKCS12\"")
@click.option('--password', default="", type=str, help="Password used for PKCS12 format.")
@pass_context
def pair(cli_ctx, keyid, filename, format, password):  # pylint: disable=function-redefined, redefined-builtin
    """Create reference PEM file for ECC Pair \n

       keyid = 32bit Key ID. Should be in hex format. Example: 0x20E8A001 \n

       filename = File name to store key. Can be in PEM or DER or PKCS12 format
       based on file extension. By default filename with extension .pem in PEM format,
       .pfx or .p12 in PKCS12 format and others in DER format.
       """
    session_status = apis.kStatus_SSS_Fail
    try:
        keyid = int(keyid, 16)
        if password == "" and \
           (filename.endswith('.pfx') or filename.endswith('.p12') or format == "PKCS12"):
            raise Exception("Password Required for PKCS12 format. "
                            "Use '--password' flag to enter password")
        try:
            session_open(cli_ctx)
            refpem_obj = RefPem(cli_ctx.session)
            status = func_timeout.func_timeout(TIME_OUT, refpem_obj.do_ecc_refpem_pair,
                                               (keyid, filename, format, password))
        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)

    except Exception as exc:  # pylint: disable=broad-except
        log_traceback(cli_ctx, exc)
        status = apis.kStatus_SSS_Fail
    if status == apis.kStatus_SSS_Success and session_status == apis.kStatus_SSS_Success:
        cli_ctx.log("Created reference key for ECC Pair from KeyID = 0x%08X" % keyid)
        ret_value = 0
    else:
        cli_ctx.log("ERROR! Could not Create reference key for ECC Pair from KeyID 0x%08X "
                    % (keyid,))
        ret_value = 1
    sys.exit(ret_value)


@ecc.command('pub', short_help='Create reference PEM file for ECC Pub')
@click.argument('keyid', type=str, metavar='keyid')
@click.argument('filename', type=str, metavar='filename')
@click.option('--format', default='',
              help="Output file format. TEXT can be \"DER\" or \"PEM\" or \"PKCS12\"")
@click.option('--password', default="", type=str, help="Password used for PKCS12 format.")
@pass_context
def pub(cli_ctx, keyid, filename, format, password):  # pylint: disable=redefined-builtin
    """Create reference PEM file for ECC Pub \n

       keyid = 32bit Key ID. Should be in hex format. Example: 20E8A001 \n

       filename = File name to store key. Data Can be in PEM or DER format or PKCS12 format
       based on file extension. By default filename with extension .pem in PEM format,
       .pfx or .p12 in PKCS12 format and others in DER format.

    """
    session_status = apis.kStatus_SSS_Fail
    try:
        keyid = int(keyid, 16)
        if password == "" and \
           (filename.endswith('.pfx') or filename.endswith('.p12') or format == "PKCS12"):
            raise Exception("Password Required for PKCS12 format. "
                            "Use '--password' flag to enter password")
        try:
            session_open(cli_ctx)
            refpem_obj = RefPem(cli_ctx.session)
            status = func_timeout.func_timeout(TIME_OUT, refpem_obj.do_ecc_refpem_pub,
                                               (keyid, filename, format, password))
        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)
    except Exception as exc:  # pylint: disable=broad-except
        log_traceback(cli_ctx, exc)
        status = apis.kStatus_SSS_Fail
    if status == apis.kStatus_SSS_Success and session_status == apis.kStatus_SSS_Success:
        cli_ctx.log("Created reference key for ECC Public Key from KeyID = 0x%08X" % keyid)
        ret_value = 0
    else:
        cli_ctx.log("ERROR! Could not Create reference key for ECC Public Key from KeyID 0x%08X "
                    % (keyid,))
        ret_value = 1
    sys.exit(ret_value)


@rsa.command('pair', short_help='Create reference PEM file for RSA Pair')
@click.argument('keyid', type=str, metavar='keyid')
@click.argument('filename', type=str, metavar='filename')
@click.option('--format', default='',
              help="Output file format. TEXT can be \"DER\" or \"PEM\" or \"PKCS12\"")
@click.option('--password', default="", type=str, help="Password used for PKCS12 format.")
@pass_context
def pair(cli_ctx, keyid, filename, format, password):  # pylint: disable=function-redefined, redefined-builtin
    """Create reference PEM file for RSA Pair \n

       keyid = 32bit Key ID. Should be in hex format. Example: 20E8A001 \n

       filename = File name to store key. Data Can be in PEM or DER format or PKCS12 format
       based on file extension. By default filename with extension .pem in PEM format,
       .pfx or .p12 in PKCS12 format and others in DER format.
    """
    session_status = apis.kStatus_SSS_Fail
    try:
        keyid = int(keyid, 16)
        if password == "" and \
           (filename.endswith('.pfx') or filename.endswith('.p12') or format == "PKCS12"):
            raise Exception("Password Required for PKCS12 format. "
                            "Use '--password' flag to enter password")
        try:
            session_open(cli_ctx)
            refpem_obj = RefPem(cli_ctx.session)
            status = func_timeout.func_timeout(TIME_OUT_RSA, refpem_obj.do_rsa_refpem_pair,
                                               (keyid, filename, format, password))
        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)

    except Exception as exc:  # pylint: disable=broad-except
        log_traceback(cli_ctx, exc)
        status = apis.kStatus_SSS_Fail
    if status == apis.kStatus_SSS_Success and session_status == apis.kStatus_SSS_Success:
        cli_ctx.log("Created reference key for RSA Pair from KeyID = 0x%08X" % keyid)
        ret_value = 0
    else:
        cli_ctx.log("ERROR! Could not Create reference key for RSA Pair from KeyID 0x%08X "
                    % (keyid,))
        ret_value = 1
    sys.exit(ret_value)
