#include "TZ_Vendor_tl.h"
#include "tci.h"
#include "tl_spay_tui_msg.h"
#include "process_cmd_coldwallet.h"
#include "process_cmd_pinpad.h"
#include "TuiState.h"
#include "TuiScreen.h"

void init() {
	initPinpadAndData();
	initTuiState();
	initScreenState();
}


uint32_t process_cmd(uint32_t commandId, tciMessage_t * sendmsg, uint32_t sendmsg_len, tciMessage_t * respmsg, uint32_t respmsg_len) {
	uint32_t ret = 0;
	TTY_LOG("process command: 0x%08x", commandId);

	switch (commandId) {
		case BC_TUI_CMD_SET_NAVIGATION_GESTURE:
		case BC_TUI_CMD_SET_PIN_TOUCHABLE_VIEW:
		case BC_TUI_CMD_SET_PIN_SCREEN_BACKGROUND:
		case BC_TUI_CMD_SEND_PIN_RESOURCE_DATA:
		case SPAY_TUI_CMD_LOAD_PIN:
		case SPAY_TUI_CMD_SET_MODE_TEXT:
		case SPAY_TUI_CMD_SET_ACTIONBAR_TEXT:
		case SPAY_TUI_CMD_SETUP:
		case SPAY_TUI_CMD_VERIFY:
		case SPAY_TUI_CMD_RESUME:
		case SPAY_TUI_CMD_CLEAR_STATE:
		case SPAY_TUI_CMD_SET_PIN_BOX:
		case SPAY_TUI_CMD_SET_PROMPT:
		case SPAY_TUI_CMD_SET_IMAGE:
		case SPAY_TUI_CMD_SET_CANCEL_IMAGE:
		case SPAY_TUI_CMD_GET_PIN:
		case SPAY_TUI_CMD_GET_SECURE_RESULT:
		case SPAY_TUI_CMD_GET_RANDOM:
		case SPAY_TUI_CMD_GENERATE_RANDOM:
		case SPAY_TUI_CMD_GET_PIN_RANDOM_FOR_WALLET:
		case SPAY_TUI_CMD_CHECK_TUI_SESSION:
		case SPAY_TUI_CMD_DRV_PIN:
		case SPAY_AUTH_CMD_SET_PREFERENCE:
		case SPAY_AUTH_CMD_CHECK_WARRANTY_BIT:
		case SPAY_AUTH_CMD_GET_NONCE:
		case SPAY_AUTH_CMD_GET_AUTH_RESULT:
			setTuiMode(PINPAD_TUI_MODE);
			ret = process_cmd_pinpad(commandId, sendmsg, sendmsg_len, respmsg, respmsg_len);
			break;

		case BC_TUI_CMD_START_BACKUP_SCREEN:
		case BC_TUI_CMD_START_RECOVERY_SCREEN:
		case BC_TUI_CMD_START_RESTORE_SCREEN:
		case BC_TUI_CMD_START_CONFIRM_SCREEN:
		case BC_TUI_CMD_GET_STATE:
		case BC_TUI_CMD_GET_SO:
		case BC_TUI_CMD_SET_SCREEN_BACKGROUND:
		case BC_TUI_CMD_SET_TOUCHABLE_VIEW:
		case BC_TUI_CMD_SET_DRAWABLE_VIEW:
		case BC_TUI_CMD_SEND_RESOURCE_DATA:
		case BC_TUI_CMD_UPDATE_SCREEN:
		case BC_TUI_CMD_SET_BACKUP_QUIZ_ORDER:
		case SPAY_TUI_CMD_DRV_QTY:
			setTuiMode(COLDWALLET_TUI_MODE);
			ret = process_cmd_coldwallet(commandId, sendmsg, sendmsg_len, respmsg, respmsg_len);
			break;

		case BC_TUI_CMD_SET_LAYOUT_PARAMS:
			ret = process_cmd_coldwallet(commandId, sendmsg, sendmsg_len, respmsg, respmsg_len);
			break;
		case BC_TUI_CMD_SEND_RESOURCE_DATA_ARRAY:
			switch (sendmsg->payload.cmd.data.screenResourceArray.type) {
				case RESOURCE_ARRAY_TYPE_FREE:
					ret = process_cmd_pinpad(commandId, sendmsg, sendmsg_len, respmsg, respmsg_len);
					if (ret == TIMA_SUCCESS) {
						ret = process_cmd_coldwallet(commandId, sendmsg, sendmsg_len, respmsg, respmsg_len);
					}
					break;
				case RESOURCE_ARRAY_TYPE_PINPAD:
					ret = process_cmd_pinpad(commandId, sendmsg, sendmsg_len, respmsg, respmsg_len);
					break;
				default:
					ret = process_cmd_coldwallet(commandId, sendmsg, sendmsg_len, respmsg, respmsg_len);
					break;
			}
			break;
		//from TLC
		case SPAY_TUI_CMD_CHECK_RET_CODE: // QC only command
		case SPAY_TUI_CMD_CLOSE:
			TTY_LOG("process command: 0x%08x, route : %d ", commandId, getTuiMode());
			if(getTuiMode() == PINPAD_TUI_MODE) {
				ret = process_cmd_pinpad(commandId, sendmsg, sendmsg_len, respmsg, respmsg_len);
			} else if(getTuiMode() == COLDWALLET_TUI_MODE) {
				ret = process_cmd_coldwallet(commandId, sendmsg, sendmsg_len, respmsg, respmsg_len);
			} else {
				TTY_LOG("error : tlc will not get response from bc tui ta!!");
			}
#ifdef USE_VS
			if(commandId == SPAY_TUI_CMD_CLOSE) {
                init();
			}
#endif
			break;
		default:
	        TTY_LOG("Not supportred command on BC_TUI. command :0x%08X ", commandId);
	        ret = TIMA_ERROR_TUI_UNKNOWN_CMD;
	        break;
	}

	return ret;
}

