#include "process_cmd.h"
#include "tz_dk_cmds.h"
#include "tz_dk_errors.h"
#include "shared/Initialize_tl.h"
#include "shared/Finalize_tl.h"
// #include "shared/Open_Secure_Channel.h"
// #include "shared/Send_APDU.h"
// #include "shared/Close_Secure_Channel.h"
#include "dk_attn.h"
#include "dk_scp_common.h"
#include "SCP03lib.h"


#ifdef DK_DEBUG
#include "dk_test.h"
#endif

uint32_t process_cmd(
	tl_dk_ctx_t * ctx,
	uint32_t commandId,
	tciMessage_t * sendmsg,
	tciMessage_t * respmsg
)
{
	uint32_t ret;
	uint8_t flag;
	DK_LOG_INFO("process_cmd");

#ifdef DK_DEBUG
	ret = RET_TL_TZ_DIGITALKEY_OK;
#else
	//ret = dk_ICCC_check();
#endif

	if(ret == ICCC_ERROR_DEVICE_STATUS_FAILED) {
		return ret;
	}

	/* Process command message */
	switch (commandId) {
		case CMD_TZ_DK_Initialize:
			DK_LOG_INFO("TZ_DIGITALKEY: process_cmd: CMD_TZ_DIGITALKEY_Initialize:");
			// ret = process_Initialize(ctx, &sendmsg->payload.init, &respmsg->payload.init);
			break;

		case CMD_TZ_DK_Open_Secure_Channel:
			DK_LOG_INFO("open secure channel ");
			// ret = process_open_secure_channel(ctx, &sendmsg->payload.open_secure_channel, &respmsg->payload.open_secure_channel);
			ret = process_scp03_open_session(ctx, &sendmsg->payload.scp03_open_session, &respmsg->payload.scp03_open_session);
			break;

		case CMD_TZ_DK_Send_APDU:
			DK_LOG_INFO("send apdu ");
			// ret = process_send_apdu(ctx, &sendmsg->payload.send_apdu, &respmsg->payload.send_apdu);
			ret = process_scp03_transceive(ctx, &sendmsg->payload.scp03_transceive, &respmsg->payload.scp03_transceive);
			break;	

		case CMD_TZ_DK_Close_Secure_Channel:
			DK_LOG_INFO("close secure channel");
			// ret = process_close_secure_channel(ctx, &sendmsg->payload.close_secure_channel, &respmsg->payload.close_secure_channel);
			ret = process_scp03_close_session(ctx, &sendmsg->payload.scp03_close_session, &respmsg->payload.scp03_close_session);
			break;

		case CMD_TZ_DK_Setup_Keys:
			ret = process_scp03_setup_keys(ctx, &sendmsg->payload.scp03_setup_keys, &respmsg->payload.scp03_setup_keys);
			break;

		case CMD_TZ_DK_Finalize:
			DK_LOG_INFO("TZ_DIGITALKEY: process_cmd: CMD_TZ_DIGITALKEY_Finalize:");
			// ret = process_Finalize(ctx, &sendmsg->payload.finalize, &respmsg->payload.finalize);
			break;

		case CMD_TZ_DK_Test:
			DK_LOG_INFO("TZ_DIGITALKEY: process_cmd: CMD_TZ_DK_Test:");
			ret = DK_SUCCESS
			break;
#ifdef DK_DEBUG
		case CMD_TZ_DK_run_tests:
			DK_LOG_INFO("running tests");
			ret = run_all_tests();
			break;
#endif
		default:
			// TODO: return UNKNOW_COMMAND error
			DK_LOG_ERR("Command unknown");
			ret = DK_ERROR_NOT_SUPPORTED;
	}

	return ret;
}
