#include <comdef.h>
#include <string.h>
#include "qsee_log.h"
#include "qsee_services.h"
#include "qsee_timer.h"
#include "qc_tima_attestation.h"

extern void tima_attestation_cmd_handler(void* cmd, uint32 cmdlen, void* rsp, uint32 rsplen);
extern void exit_tima_attestation(void);

/** 
 * Modify the app name to your specific app name  
 */
char TZ_APP_NAME[] = {"tima_atn"};

/**
  @brief 
    Add any app specific initialization code here
    QSEE will call this function after secure app is loaded and
    authenticated
*/
void tz_app_init(void)
{
  /*  App specific initialization code*/
   qsee_log(QSEE_LOG_MSG_ERROR, "TIMA Attestation Init ");
}


void tz_app_cmd_handler(void* cmd, uint32 cmdlen,
			void* rsp, uint32 rsplen)
{
	tima_attestation_cmd_type cmd_id = TIMA_ATTESTATION_CMD_UNKNOWN;

	if ((NULL == cmd) || (NULL == rsp)) {
		qsee_log(QSEE_LOG_MSG_ERROR,
			 "tz_app_cmd_handler invalid input");
		return;
	}

	if (cmdlen >= sizeof(tima_attestation_cmd_type)) {
		// First 4 bytes are always command id
		cmd_id = (*(uint32*)cmd);
	} else {
		qsee_log(QSEE_LOG_MSG_ERROR,
			 "cmdlen = %u < %u = sizeof(tima_attestation_cmd_type)",
			 cmdlen, sizeof(tciMessage_t));
		return;
	}

	switch (cmd_id) {
	case TIMA_ATTESTATION_INIT:
		if (cmdlen < sizeof(tima_attestation_init_t)) {
			qsee_log(QSEE_LOG_MSG_ERROR,
				 "cmdlen = %u < %u = sizeof(tima_attestation_init_t)",
				 cmdlen, sizeof(tima_attestation_init_t));
			return;
		}
		break;
	case TIMA_ATTESTATION_CMD:
		if (cmdlen < sizeof(tima_attestation_req_old_t)) {
			qsee_log(QSEE_LOG_MSG_ERROR,
				"cmdlen = %u < %u = sizeof(tima_attestation_req_old_t)",
				cmdlen, sizeof(tima_attestation_req_old_t));
			return;
		}
		break;
	default:
		if (cmdlen < sizeof(tima_attestation_req_t)) {
			qsee_log(QSEE_LOG_MSG_ERROR,
				 "cmdlen = %u < %u = sizeof(tima_attestation_req_t)",
				 cmdlen, sizeof(tima_attestation_req_t));
			return;
		}
		break;
	}

	if (rsplen < sizeof(tima_attestation_rsp_t)) {
		qsee_log(QSEE_LOG_MSG_ERROR,
			 "rsplen = %u < %u = sizeof(tima_attestation_rsp_t)",
			 rsplen, sizeof(tima_attestation_rsp_t));
		return;
	}

	if (SVC_TIMA_ATTESTATION_ID == (cmd_id & 0xFFFF0000)) {
		tima_attestation_cmd_handler(cmd, cmdlen, rsp, rsplen);
	} else {
		qsee_log(QSEE_LOG_MSG_ERROR,
			 "invalid command id: %u", cmd_id);
		return;
	}

	return;
}


/**
  @brief 
    App specific shutdown
    App will be given a chance to shutdown gracefully
*/
void tz_app_shutdown(void)
{
  exit_tima_attestation();
  /* app specific shutdown code*/
  qsee_log(QSEE_LOG_MSG_DEBUG, "TIMA attestation shutdown");
  return;
}
