#include "TZ_Vendor_debug_tl.h"
#include "tl_tui_bc_error_msg.h"
#include "Vendor_Interface.h"
#include "TuiState.h"
#include "TuiTouch.h"

static TuiMode tuiMode = PINPAD_TUI_MODE;
static TuiState tuiState = NONE_TUI_STATE;
static TuiState preTuiState = NONE_TUI_STATE;

static bool tuiPinMode = false;

void setTuiPinMode(bool mode){
	tuiPinMode = mode;
}

bool isTuiPinMode(){
	return tuiPinMode;
}

void setTuiMode(TuiMode mode) {
	tuiMode = mode;
}

TuiMode getTuiMode() {
	return tuiMode;
}

void setPreState(TuiState preState) {
	preTuiState = preState;
}

TuiState getPreState() {
	return preTuiState;
}

void initTuiState(){
	tuiState = NONE_TUI_STATE;
	preTuiState = NONE_TUI_STATE;
}

void changeState(TuiState state) {
	TTY_LOG("bctui tried to change State from 0x%x to 0x%x", (uint32_t)tuiState, (uint32_t)state);

	switch (state) {
		case CONFIRMED_TUI_STATE:
		case RESTORED_TUI_STATE:
			if (tuiState == SESSION_ON_TUI_STATE) {
				setEndOfTouch(END_OF_TOUCH);
				setPreState(tuiState);
				tuiState = state;
			}
			break;
		case CANCELLED_TUI_STATE:
		case OK_TUI_STATE:
		case FAILED_TUI_STATE:
		case TEXT_LINK_TUI_STATE:
		case INVALID_IMAGE_TUI_STATE:
			setEndOfTouch(END_OF_TOUCH);
			setPreState(tuiState);
			tuiState = state;
			break;
		case SESSION_ON_TUI_STATE:
			setEndOfTouch(CONTINUE_OF_TOUCH);
			setPreState(tuiState);
			tuiState = state;
			break;
		case SESSION_OFF_TUI_STATE:
			setEndOfTouch(END_OF_TOUCH);
			setPreState(tuiState);
			tuiState = state;
			break;
		case NONE_TUI_STATE: // do not anything.
			TTY_LOG("tuiState: cannot change to  tuiState NONE_TUI_STATE");
			break;
		case WRONG_FP_TUI_STATE:
			setEndOfTouch(END_OF_TOUCH);
			if (preTuiState == SESSION_ON_TUI_STATE) {
				setPreState(tuiState);
				tuiState = state;
			}
			break;
		case TRY_AGAIN_FP_TUI_STATE:
			setEndOfTouch(END_OF_TOUCH);
			if (preTuiState == SESSION_ON_TUI_STATE) {
				setPreState(tuiState);
				tuiState = state;
			}
			break;
		case GET_TRANSACTION_SO_STATE:
		case SETTING_BACKGROUND_TUI_STATE:
		case SETTING_TOUCHABLE_VIEW_TUI_STATE:
		case SETTING_DRAWABLE_VIEW_TUI_STATE:
		case SETTING_BACKGROUND_SESSION_ON_TUI_STATE:
		case SETTING_TOUCHABLE_VIEW_SESSION_ON_TUI_STATE:
		case SETTING_DRAWABLE_VIEW_SESSION_ON_TUI_STATE:
		case REQUEST_TEXT_RESTORE_WRONG_INPUT_TUI_STATE:
		case UPDATE_SCREEN_BACKUP_TUI_STATE:
		case UPDATE_SCREEN_BACKUP_QUIZ_TUI_STATE:
		case UPDATE_SCREEN_RECOVERY_TUI_STATE:
		case UPDATE_SCREEN_RESTORE_TUI_STATE:
		case UPDATE_SCREEN_CONFIRM_TUI_STATE:
		case UPDATE_SCREEN_POPUP_BACKUP_EXIT_TUI_STATE:
		case UPDATE_SCREEN_POPUP_RESTORE_EXIT_TUI_STATE:
		case UPDATE_SCREEN_POPUP_RESTORE_FAILED_CHECKSUM_TUI_STATE:
		case REQUEST_TEXT_BACKUP_FIRST_WRONG_INPUT_TUI_STATE:
		case REQUEST_TEXT_BACKUP_SECOND_WRONG_INPUT_TUI_STATE:
		case REQUEST_TEXT_BACKUP_THIRD_WRONG_INPUT_TUI_STATE:
		case SETTING_BACKUP_QUIZ_ORDER_TUI_STATE:
		case SETTING_BACKUP_QUIZ_ORDER_SESSION_ON_TUI_STATE:
            setEndOfTouch(END_OF_TOUCH);
			setPreState(tuiState);
			tuiState = state;
			break;

		default:
		TTY_LOG("tuiState: cannot catch tuiState 0x%x", state);
		break;
	}
}

TuiState getState() {
	return tuiState;
}