/*
 * process_cmd.c
 */

#include "process_cmd_private.h"
#include "tz_arcounter_cmds.h"
#include "tz_arcounter_errors.h"
#include "rpmb_storage.h"

uint32_t process_cmd(
	tl_arcounter_ctx_t * ctx,
	uint32_t commandId,
	tciMessage_t * sendmsg,
	tciMessage_t * respmsg
)
{
	uint32_t ret;
	uint8_t flag;

	/* Process command message */
	switch (commandId) {
	case CMD_TZ_ARCOUNTER_Initialize:
		//TTY_LOG("TZ_ARCOUNTER: process_cmd: CMD_TZ_ARCOUNTER_Initialize:");
		ret = process_Initialize(ctx, &sendmsg->payload.init, &respmsg->payload.init);
		break;

	case CMD_TZ_ARCOUNTER_Finalize:
		//TTY_LOG("TZ_ARCOUNTER: process_cmd: CMD_TZ_ARCOUNTER_Finalize:");
		ret = process_Finalize(ctx, &sendmsg->payload.finalize, &respmsg->payload.finalize);
		break;

	case CMD_TZ_ARCOUNTER_EnableCounter:
		TTY_LOG("TZ_ARCOUNTER: process_cmd: CMD_TZ_ARCOUNTER_EnableCounter:");
		ret = process_StoreRTCTime(ctx, &sendmsg->payload.storertctime, &respmsg->payload.storertctime, 1);
		if (ret != RET_TL_TZ_ARCOUNTER_OK) {
			return ret;
		}
		break;

	case CMD_TZ_ARCOUNTER_UpdateTick:
		TTY_LOG("TZ_ARCOUNTER: process_cmd: CMD_TZ_ARCOUNTER_UpdateTick:");
		ret = process_UpdateTick(ctx, &sendmsg->payload.updatetick, &respmsg->payload.updatetick);
		break;

	case CMD_TZ_ARCOUNTER_SetTimer:
		TTY_LOG("TZ_ARCOUNTER: process_cmd: CMD_TZ_ARCOUNTER_SetTimer:");
		ret = process_SetTimer(ctx, &sendmsg->payload.settimer, &respmsg->payload.settimer);
		break;

	case CMD_TZ_ARCOUNTER_ChangeTime:
		TTY_LOG("TZ_ARCOUNTER: process_cmd: CMD_TZ_ARCOUNTER_ChangeTime:");
		ret = process_ChangeTime(ctx, &sendmsg->payload.changetime, &respmsg->payload.changetime);
		break;

	case CMD_TZ_ARCOUNTER_GetReferenceTime:
		TTY_LOG("TZ_ARCOUNTER: process_cmd: CMD_TZ_ARCOUNTER_GetReferenceTime:");
		ret = process_GetReferenceTime(ctx, &sendmsg->payload.getreftime, &respmsg->payload.getreftime);
		break;

	case CMD_TZ_ARCOUNTER_GetTimer:
		TTY_LOG("TZ_ARCOUNTER: process_cmd: CMD_TZ_ARCOUNTER_GetTimer:");
		ret = process_GetTimer(ctx, &sendmsg->payload.gettimer, &respmsg->payload.gettimer);
		break;

	case CMD_TZ_ARCOUNTER_GetRemainingTime:
		TTY_LOG("TZ_ARCOUNTER: process_cmd: CMD_TZ_ARCOUNTER_GetRemainingTime:");
		ret = process_GetRemainingTime(ctx, &sendmsg->payload.getremainingtime, &respmsg->payload.getremainingtime);
		break;

	case CMD_TZ_ARCOUNTER_CancelTimer:
		TTY_LOG("TZ_ARCOUNTER: process_cmd: CMD_TZ_ARCOUNTER_CancelTimer:");
		if ((arcounter_check_flag(&flag) == ARCOUNTER_RPMB_SUCCESS)
		&&  (flag == 1)) {
			ret = process_CancelTimer(ctx, &sendmsg->payload.canceltimer, &respmsg->payload.canceltimer);
		}
		else {
			TTY_LOG("TZ_ARCOUNTER: arcounter_rpmb is failure!");
			ret = RET_TL_TZ_ARCOUNTER_RPMB_FAILURE;
		}
		break;

	case CMD_TZ_ARCOUNTER_StoreRTCTime:
	{
		uint8_t flag = 0;
		TTY_LOG("TZ_ARCOUNTER: process_cmd: CMD_TZ_ARCOUNTER_StoreRTCTime:");
			ret = process_StoreRTCTime(ctx, &sendmsg->payload.storertctime, &respmsg->payload.storertctime, 0);
		break;
	}

	case CMD_TZ_ARCOUNTER_DisableCounter:
		TTY_LOG("TZ_ARCOUNTER: process_cmd: CMD_TZ_ARCOUNTER_DisableCounter:");
		if (arcounter_rpmb_set_flag(0) == ARCOUNTER_RPMB_SUCCESS) {
			TTY_LOG("TZ_ARCOUNTER: disabled!");
			ret = set_attn(ATTN_SC_STATUS, SC_DISABLED);
			if (ret != RET_TL_TZ_ARCOUNTER_OK) {
				TTY_LOG("TZ_ARCOUNTER: sc status is updated!");
			}
		}
		else {
			TTY_LOG("TZ_ARCOUNTER: arcounter_rpmb is failure!");
			ret = RET_TL_TZ_ARCOUNTER_RPMB_FAILURE;
		}
		break;

	default:
		TTY_LOG("TZ_ARCOUNTER: process_cmd default: %d", commandId);
		/* Unknown command ID */
		ret = RET_TL_TZ_ARCOUNTER_UNKNOWN_CMD;
		break;
	}
#if 0
	if (ret != RET_TL_TZ_ARCOUNTER_OK) {
		set_attn(ATTN_SC_STATUS, SC_ABNORMAL_RETURN);
	}
#endif
	return ret;
}
