/* Copyright 2020 NXP
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/** @file se05x_Personalization_Main.c
 *
 * This file solves purpose for
 */

/* ************************************************************************** */
/* Includes                                                                   */
/* ************************************************************************** */

#include "se05x_Personalization.h"
#include "nxLog_App.h"
#include "se05x_perso_api.h"
#include "nxEnsure.h"

/* ************************************************************************** */
/* Local Defines                                                              */
/* ************************************************************************** */

/* ************************************************************************** */
/* Structures and Typedefs                                                    */
/* ************************************************************************** */

/* ************************************************************************** */
/* Global Variables                                                           */
/* ************************************************************************** */

/* ************************************************************************** */
/* Static function declarations                                               */
/* ************************************************************************** */

/* ************************************************************************** */
/* Public Functions                                                           */
/* ************************************************************************** */

static ex_sss_boot_ctx_t gex_sss_perso_ctx;

#define EX_SSS_BOOT_PCONTEXT (&gex_sss_perso_ctx)
#define EX_SSS_BOOT_DO_ERASE 0
#define EX_SSS_BOOT_EXPOSE_ARGC_ARGV 1
#define EX_SSS_BOOT_SKIP_SELECT_APPLET 1

#include <ex_sss_main_inc.h>

#define PERSO_IF_API(NAME, DESCRIPTION)            \
    {                                              \
        (#NAME), (DESCRIPTION), (&ex_perso_##NAME) \
    }

static const ex_perso_if_t gpExPersoIF[] = {
    PERSO_IF_API(HELP, "Prints list of APIs"),
    PERSO_IF_API(I2C_DisableClockStretching, "I2C: Disables clock stretching"),
    PERSO_IF_API(I2C_EnableCLockStretching, "I2C: Enables clock stretching"),

    PERSO_IF_API(I2C_ProtocolGP, "I2C: Use GP Mode for I2C"),
    PERSO_IF_API(I2C_ProtocolUM, "I2C: Use UM Mode like SE050 for I2C"),

    PERSO_IF_API(I2C_ProtocolAutoDetect, "I2C: Automatically detect I2C Protocol"),
    PERSO_IF_API(I2C_ProtocolManual, "I2C: Manually use fixed Protocol"),

    PERSO_IF_API(I2C_EnablePowerSave, "I2C: Go to power save after last APDU"),
    PERSO_IF_API(I2C_DisablePowerSave, "I2C: DO not go to power save after last APDU"),

    PERSO_IF_API(I2C_SemiBlocking, "I2C: SEMI Blocking I2C"),
    PERSO_IF_API(I2C_NonBlocking, "I2C: Non Blocking I2C"),

    PERSO_IF_API(RM_MOD_IOT_EXTENDED, "Delete: Extension to Elliptic Curve Cryptography."),

    PERSO_IF_API(RM_MOD_IOT_BASE, "Delete: Collection of crypto algorithms often used in IoT devices."),

    PERSO_IF_API(RM_MODX_EGOVACCELERATORS,
        "Delete: Secure Messaging Accelerators for eGovernment applications and modular arithmetic math API."),

    PERSO_IF_API(RM_MOD_RSAKEYGEN, "On chip generation of RSA keys."),

    {NULL, NULL, NULL},
};

const char *program_name = NULL;

sss_status_t ex_sss_entry(ex_sss_boot_ctx_t *pCtx)
{
    sss_status_t status           = kStatus_SSS_Fail;
    smStatus_t sm_status          = SM_NOT_OK;
    sss_se05x_session_t *pSession = (sss_se05x_session_t *)&pCtx->session;
    int i                         = 0;
    program_name                  = gex_sss_argv[0];
    bool fFound                   = FALSE;

    const ex_perso_if_t *apis_to_run[50] = {0};

    for (i = 0; i < ARRAY_SIZE(apis_to_run); i++) {
        int j;
        for (j = i + 1; j < (gex_sss_argc - 1) && apis_to_run[i] == NULL; j++) {
            for (const ex_perso_if_t *pf = &gpExPersoIF[0]; pf->name != NULL; pf++) {
                if (0 == STRNICMP(pf->name, gex_sss_argv[j], strlen(pf->name) + 1)) {
                    apis_to_run[i] = pf;
                    fFound         = TRUE;
                    break;
                }
            }
            if (apis_to_run[i] == NULL) {
                LOG_E("Don't know what to do with argument '%s'", gex_sss_argv[j]);
                fFound = FALSE;
                i      = ARRAY_SIZE(apis_to_run);
                break;
            }
        }
    }

    if (fFound) {
        smStatus_t open_perso_applet_status = ex_perso_OpenApplet(&pSession->s_ctx);
        ENSURE_OR_GO_EXIT(SM_OK == open_perso_applet_status);
        for (i = 0; i < ARRAY_SIZE(apis_to_run); i++) {
            const ex_perso_if_t *api_to_run = apis_to_run[i];
            if (api_to_run != NULL) {
                LOG_I("# Running %s : %s", api_to_run->name, api_to_run->description);
                sm_status = api_to_run->fpAPI(&pSession->s_ctx);
                ENSURE_OR_GO_EXIT(SM_OK == sm_status);
            }
        }
    }
    else {
        // ! fFound;
        sm_status = ex_perso_HELP(&pSession->s_ctx);
    }

    if (sm_status == SM_OK) {
        status = kStatus_SSS_Success;
    }
exit:
    if (kStatus_SSS_Success == status) {
        LOG_I("se05x_Personalization Example Success !!!...");
    }
    else {
        LOG_E("se05x_Personalization Example Failed !!!...");
    }
    return status;
}

/* ************************************************************************** */
/* Private Functions                                                          */
/* ************************************************************************** */

smStatus_t ex_perso_OpenApplet(pSe05xSession_t session_ctx)
{
    smStatus_t status = Se05x_API_Perso_SelectApplet(session_ctx);
    return status;
}

smStatus_t ex_perso_HELP(pSe05xSession_t session_ctx)
{
    printf("\nUSAGE:\n");
    if (program_name != NULL) {
        printf("%s <operation> [operation] <port_name>\n", program_name);
        printf("\n");
        printf("Where, 'operation': one or sequence of the following:\n\n");
        for (const ex_perso_if_t *pf = &gpExPersoIF[0]; pf->name != NULL; pf++) {
            printf(" %30s : %s\n", pf->name, pf->description);
        }
        printf("\n");
        LOG_I("NOTE-1: You can add more operations in a single command.");
        LOG_W("NOTE-2: These values are effective only after IC Reset.");
        printf("\n");
    }
    return SM_OK;
}
