#include <string.h>
#include "TuiLayout.h"
#include "TuiRotation.h"
#include "TZ_Vendor_debug_tl.h"

#if defined(W1536)
#include "TuiLayout_w1536.h"
#elif defined(DPI640)
#include "TuiLayout_w1440.h"
#elif defined(DPI480)
#include "TuiLayout_w1080.h"
#elif defined(DPI320)
#include "TuiLayout_w720.h"
#else
#include "TuiLayout_w1080.h"
#endif

uint32_t BACKUP_MNEMONIC_LIST_COLUMN_COUNT;
uint32_t BACKUP_MNEMONIC_LIST_TOP_MARGIN;
uint32_t BACKUP_MNEMONIC_LIST_SIDE_MARGIN;
uint32_t BACKUP_MNEMONIC_LIST_TEXTBOX_HEIGHT;
uint32_t BACKUP_MNEMONIC_LIST_NUMBER_WIDTH;
uint32_t BACKUP_MNEMONIC_LIST_NUMBER_DISTANCE;
uint32_t BACKUP_MNEMONIC_LIST_TEXTBOX_DISTANCE;
uint32_t BACKUP_MNEMONIC_LIST_TEXTBOX_LINE_DISTANCE;

uint32_t BACKUP_QUIZ_TEXTINPUT_START_TOP_MARGIN;
uint32_t BACKUP_QUIZ_TEXTINPUT_LEFT_MARGIN;
uint32_t BACKUP_QUIZ_TEXTINPUT_WIDTH;
uint32_t BACKUP_QUIZ_TEXTINPUT_HEIGHT;
uint32_t BACKUP_QUIZ_TEXTINPUT_LINE_DISTANCE;
uint32_t BACKUP_QUIZ_BUTTON_START_TOP_MARGIN;
uint32_t BACKUP_QUIZ_BUTTON_LEFT_MARGIN;
uint32_t BACKUP_QUIZ_BUTTON_WIDTH;
uint32_t BACKUP_QUIZ_BUTTON_HEIGHT;
uint32_t BACKUP_QUIZ_NEXT_DISTANCE;
uint32_t BACKUP_QUIZ_KEYPAD_START_X;
uint32_t BACKUP_QUIZ_KEYPAD_START_Y;

//confirm
uint32_t CONFIRM_TEXT_SIDE_MARGIN;
uint32_t CONFIRM_TEXT_ADDRESS_TOP_MARGIN;
uint32_t CONFIRM_TEXT_ADDRESS_HEIGHT;
uint32_t CONFIRM_TEXT_2ND_ADDRESS_Y_DISTANCE;
uint32_t CONFIRM_TEXT_AREA_WIDTH;
uint32_t CONFIRM_DIVIDER_SIDE_MARGIN;
uint32_t CONFIRM_DIVIDER_LINE_DISTANCE;
uint32_t CONFIRM_DIVIDER_LINE_DISTANCE2;
uint32_t CONFIRM_TEXT_TOKEN_NAME_LINE_DISTANCE;
uint32_t CONFIRM_TEXT_TOKEN_AMOUNT_LINE_DISTANCE;
uint32_t CONFIRM_TEXT_AMOUNT_LINE_DISTANCE;
uint32_t CONFIRM_TEXT_GAS_SIDE_MARGIN;
uint32_t CONFIRM_TEXT_GAS_PRICE_LINE_DISTANCE;
uint32_t CONFIRM_TEXT_GAS_LIMIT_LINE_DISTANCE;
uint32_t CONFIRM_TEXT_DATA_LINE_DISTANCE;
uint32_t CONFIRM_TEXT_DATA_LENGTH_LINE_DISTANCE;
uint32_t CONFIRM_TEXT_DATA_LINE_FIXED_DISTANCE;

//keypad
uint32_t CONTROL_KEYPAD_BUTTON_DISTANCE_WIDTH;
uint32_t CONTROL_KEYPAD_BUTTON_DISTANCE_HEIGHT;
uint32_t CONTROL_KEYPAD_BUTTON_MARGIN_WIDTH;
uint32_t CONTROL_KEYPAD_BUTTON_MARGIN_HEIGHT;
uint32_t CONTROL_KEYPAD_BUTTON_WIDTH;
uint32_t CONTROL_KEYPAD_BUTTON_HEIGHT;
uint32_t CONTROL_KEYPAD_TOP_MARGIN;
uint32_t CONTROL_KEYPAD_SIDE_MARGIN_LEFT;
uint32_t CONTROL_KEYPAD_SIDE_MARGIN_RIGHT;
uint32_t CONTROL_KEYPAD_BACK_SPACE_WIDTH;
uint32_t CONTROL_KEYPAD_BACK_SPACE_HEIGHT;

//restore
uint32_t RESTORE_KEYPAD_START_X;
uint32_t RESTORE_KEYPAD_START_Y;
uint32_t RESTORE_MNEMONIC_TEXTBOX_WIDTH;
uint32_t RESTORE_MNEMONIC_TEXTBOX_HEIGHT;
uint32_t RESTORE_MNEMONIC_TEXTINPUT_START_X;
uint32_t RESTORE_MNEMONIC_TEXTINPUT_START_Y;
uint32_t RESTORE_MNEMONIC_TEXTINPUT_WIDTH;
uint32_t RESTORE_MNEMONIC_TEXTINPUT_HEIGHT;
uint32_t RESTORE_MNEMONIC_TEXTINPUT_CURSOR_MARGIN;
uint32_t RESTORE_MNEMONIC_TEXTINPUT_LINE_START_Y;
uint32_t RESTORE_MNEMONIC_LIST_TEXT_AREA_TOP_MARGIN;
uint32_t RESTORE_MNEMONIC_LIST_TEXT_AREA_SIDE_MARGIN;
uint32_t RESTORE_MNEMONIC_LIST_TEXT_AREA_WIDTH;
uint32_t RESTORE_MNEMONIC_LIST_TEXT_AREA_HEIGHT;
uint32_t RESTORE_MNEMONIC_LIST_TOP_MARGIN;
uint32_t RESTORE_MNEMONIC_LIST_SIDE_MARGIN;
uint32_t RESTORE_MNEMONIC_LIST_MAX_COUNT;
uint32_t RESTORE_MNEMONIC_LIST_COLUMN_COUNT;
uint32_t RESTORE_MNEMONIC_LIST_LINE_DISTANCE;
uint32_t RESTORE_MNEMONIC_RECOMMEND_TOP_MARGIN;
uint32_t RESTORE_MNEMONIC_RECOMMEND_SIDE_MARGIN;
uint32_t RESTORE_MNEMONIC_RECOMMEND_COLUMN_COUNT;
uint32_t RESTORE_MNEMONIC_RECOMMEND_LINE_DISTANCE;
uint32_t RESTORE_MNEMONIC_RECOMMEND_WIDTH;
uint32_t RESTORE_MNEMONIC_RECOMMEND_HEIGHT;

//pinpad
uint32_t PINPAD_SOFTKEY_DP;
uint32_t PINPAD_SOFTKEY_HEIGHT;
uint32_t PINPAD_BOTTOM_BAR_HEIGHT;
uint32_t PINPAD_KEY_WIDTH;
uint32_t PINPAD_KEY_HEIGHT;
uint32_t PINPAD_STAR_SIZE;
uint32_t PINPAD_HEIGHT_DP;

uint32_t PINPAD_COL1_LEFT_HD;
uint32_t PINPAD_COL1_RIGHT_HD;
uint32_t PINPAD_COL2_LEFT_HD;
uint32_t PINPAD_COL2_RIGHT_HD;
uint32_t PINPAD_COL3_LEFT_HD;
uint32_t PINPAD_COL3_RIGHT_HD;

uint32_t PINPAD_LINE1_TOP_HD;
uint32_t PINPAD_LINE1_BOTTOM_HD;
uint32_t PINPAD_LINE2_TOP_HD;
uint32_t PINPAD_LINE2_BOTTOM_HD;
uint32_t PINPAD_LINE3_TOP_HD;
uint32_t PINPAD_LINE3_BOTTOM_HD;
uint32_t PINPAD_LINE4_TOP_HD;
uint32_t PINPAD_LINE4_BOTTOM_HD;

uint32_t PINPAD_SOFTKEY_LEFT;
uint32_t PINPAD_SOFTKEY_TOP;
uint32_t PINPAD_SOFTKEY_BACK_LEFT;
uint32_t PINPAD_SOFTKEY_BACK_RIGHT;
uint32_t PINPAD_SOFTKEY_BACK_TOP;
uint32_t PINPAD_SOFTKEY_BACK_BOTTOM;
uint32_t PINPAD_SOFTKEY_BACK_BHR_LEFT;
uint32_t PINPAD_SOFTKEY_BACK_BHR_RIGHT;
uint32_t PINPAD_SOFTKEY_BACK_BHR_TOP;
uint32_t PINPAD_SOFTKEY_BACK_BHR_BOTTOM;

uint32_t PINPAD_STATUS_BAR_HEIGHT;
uint32_t PINPAD_ACTION_BAR_TOP;
uint32_t PINPAD_ACTION_BAR_HEIGHT;
uint32_t PINPAD_ACTION_BAR_TEXT_LEFT_DP;

uint32_t PINPAD_PIN_BOX_DISTANCE;
uint32_t PINPAD_PIN_BOX_WIDTH;
uint32_t PINPAD_PIN_BOX_HEIGHT;
uint32_t PINPAD_PIN_BOX_SPACE;
uint32_t PINPAD_PIN_BOX_IMG_WIDTH;
uint32_t PINPAD_PIN_BOX_IMG_HEIGHT;
uint32_t PINPAD_PIN_BOX_TOP;
uint32_t PINPAD_PIN_BOX_BOTTOM;

uint32_t PINPAD_PIN_TEXT_TOP;
uint32_t PINPAD_PIN_TEXT_BOTTOM;

uint32_t PINPAD_PROMPT_DISTANCE;
uint32_t PINPAD_PROMPT_AREA_TOP;
uint32_t PINPAD_PROMPT_AREA_BOTTOM;

uint32_t PINPAD_SECURE_ICON_WIDTH;
uint32_t PINPAD_SECURE_ICON_TOP;
uint32_t PINPAD_SECURE_ICON_TEXT_DISTANCE;
uint32_t PINPAD_SECURE_MODE_TEXT_TOP;

uint32_t PINPAD_ACTION_BAR_BACK_BUTTON_SIZE;
uint32_t PINPAD_ACTION_BAR_BACK_BUTTON_LEFT;
uint32_t PINPAD_ACTION_BAR_BACK_BUTTON_RIGHT;
uint32_t PINPAD_ACTION_BAR_BACK_BUTTON_TOP;
uint32_t PINPAD_ACTION_BAR_BACK_BUTTON_BOTTOM;

//screen
float SCREEN_PIX_PER_DP;
uint32_t SCREEN_PUNCHCUT_HEIGHT;
uint32_t SCREEN_WIDTH;
uint32_t SCREEN_HEIGHT;
int32_t keypadLoctionAdjustment[CONTROL_KEYPAD_COLUMN_COUNT * 3][2];
int32_t backspaceLoctionAdjustment[2];
static EScreenType gScreenType = SCREEN_TYPE_DEFAULT;

//pinpad
sLayout_t g_pinpad_layout;
sPinPadKey_t g_softkey[SOFTKEY_SIZE];
sPinPadKey_t g_softkey_bhr[SOFTKEY_SIZE];
uint32_t g_pinbox_space;
uint32_t g_pinbox_width;
uint32_t g_pinbox_height;
uint32_t g_pinbox_y;

void setPinpadLayout();
void setSoftkey();

void initLayout() {
	setScreenType(SCREEN_TYPE_DEFAULT);
#if defined(W1536)
	setRotationType(CLOCKWISE_ROTATION_TYPE);
	initLayoutW1536();
#elif defined(DPI320)
	initLayoutW720();
#elif defined(DPI480)
	initLayoutW1080();
#elif defined(DPI640)
	initLayoutW1440();
#endif
	if (getTuiMode() == PINPAD_TUI_MODE) {
		setPinpadLayout();
		setSoftkey();
	}
}

void setScreenType(EScreenType type) {
	gScreenType = type;
}

EScreenType getScreenType() {
	return gScreenType;
}

void setPinpadLayout() {
	sLayout_t pinpad_layout = {
		/* sPinPadKey_t buttons_array[PINPAD_SIZE+1] */ {
								 {0, 0, 0, 0,
								  PAD_NOKEY_VAL, NOKEY}
								 ,
								 {PINPAD_COL1_LEFT_HD,
								  PINPAD_COL1_RIGHT_HD,
								  PINPAD_LINE1_TOP_HD,
								  PINPAD_LINE1_BOTTOM_HD,
								  1, PAD_NUM}
								 ,
								 {PINPAD_COL2_LEFT_HD,
								  PINPAD_COL2_RIGHT_HD,
								  PINPAD_LINE1_TOP_HD,
								  PINPAD_LINE1_BOTTOM_HD,
								  2, PAD_NUM}
								 ,
								 {PINPAD_COL3_LEFT_HD,
								  PINPAD_COL3_RIGHT_HD,
								  PINPAD_LINE1_TOP_HD,
								  PINPAD_LINE1_BOTTOM_HD,
								  3, PAD_NUM}
								 ,
								 {PINPAD_COL1_LEFT_HD,
								  PINPAD_COL1_RIGHT_HD,
								  PINPAD_LINE2_TOP_HD,
								  PINPAD_LINE2_BOTTOM_HD,
								  4, PAD_NUM}
								 ,
								 {PINPAD_COL2_LEFT_HD,
								  PINPAD_COL2_RIGHT_HD,
								  PINPAD_LINE2_TOP_HD,
								  PINPAD_LINE2_BOTTOM_HD,
								  5, PAD_NUM}
								 ,
								 {PINPAD_COL3_LEFT_HD,
								  PINPAD_COL3_RIGHT_HD,
								  PINPAD_LINE2_TOP_HD,
								  PINPAD_LINE2_BOTTOM_HD,
								  6, PAD_NUM}
								 ,
								 {PINPAD_COL1_LEFT_HD,
								  PINPAD_COL1_RIGHT_HD,
								  PINPAD_LINE3_TOP_HD,
								  PINPAD_LINE3_BOTTOM_HD,
								  7, PAD_NUM}
								 ,
								 {PINPAD_COL2_LEFT_HD,
								  PINPAD_COL2_RIGHT_HD,
								  PINPAD_LINE3_TOP_HD,
								  PINPAD_LINE3_BOTTOM_HD,
								  8, PAD_NUM}
								 ,
								 {PINPAD_COL3_LEFT_HD,
								  PINPAD_COL3_RIGHT_HD,
								  PINPAD_LINE3_TOP_HD,
								  PINPAD_LINE3_BOTTOM_HD,
								  9, PAD_NUM}
								 ,
								 {PINPAD_COL2_LEFT_HD,
								  PINPAD_COL2_RIGHT_HD,
								  PINPAD_LINE4_TOP_HD,
								  PINPAD_LINE4_BOTTOM_HD,
								  0, PAD_NUM}
								 ,
								 {PINPAD_COL1_LEFT_HD,
								  PINPAD_COL1_RIGHT_HD,
								  PINPAD_LINE4_TOP_HD,
								  PINPAD_LINE4_BOTTOM_HD,
								  PAD_CORRECT_VAL,
								  PAD_CORRECT}
								 ,
								 {PINPAD_COL3_LEFT_HD,
								  PINPAD_COL3_RIGHT_HD,
								  PINPAD_LINE4_TOP_HD,
								  PINPAD_LINE4_BOTTOM_HD,
								  PAD_VALIDATE_VAL,
								  NOKEY} // Actual key type is PAD_VALIDATE, but replaced with NOKEY because of issue that pressed button image left even finger is released.
								 ,
								 {PINPAD_ACTION_BAR_BACK_BUTTON_LEFT, PINPAD_ACTION_BAR_BACK_BUTTON_RIGHT, PINPAD_ACTION_BAR_BACK_BUTTON_TOP, PINPAD_ACTION_BAR_BACK_BUTTON_BOTTOM, PAD_CANCEL_VAL, PAD_CANCEL}
								 }
		,
		/* sTextAreaLayout_t textarea */ {
						  0, 0,
						  PINPAD_PIN_TEXT_TOP,
						  PINPAD_PIN_TEXT_BOTTOM,
						  0, 0,
						  }
		,
		/* secret image */
		{
		 0, 0, 0, 0}
		,
		/* prompt message */
		{
		 0,			// not used (dynamically center all prompts)
		 PINPAD_PIN_TEXT_TOP,
		 0,			// not used (dynamically center)
		 PINPAD_PIN_TEXT_TOP,
		 }
		,
		/* OK enable/disable */
		{
		 0, 0}
	};
	memcpy(&g_pinpad_layout, &pinpad_layout, sizeof(pinpad_layout));

	g_pinbox_space = PINPAD_PIN_BOX_SPACE;
	g_pinbox_width = PINPAD_PIN_BOX_WIDTH;
	g_pinbox_height = PINPAD_PIN_BOX_HEIGHT;
	g_pinbox_y = PINPAD_PIN_BOX_TOP;
}

void setSoftkey() {
#if defined(SUPPORT_SOFTKEY) || defined(SUPPORT_SOFTKEY_PUNCHCUT) || defined(SUPPORT_SOFTKEY_PUNCHHOLE) || defined(SUPPORT_DISPLAY_HIDE_NOTCH) || defined(SUPPORT_DUAL_LCD_MAIN) || defined(SUPPORT_DUAL_LCD_SUB)
	sPinPadKey_t softkey[SOFTKEY_SIZE] =
	{
		{
			PINPAD_SOFTKEY_BACK_LEFT,
			PINPAD_SOFTKEY_BACK_RIGHT,
			PINPAD_SOFTKEY_BACK_TOP,
			PINPAD_SOFTKEY_BACK_BOTTOM,
			PAD_SOFTKEY_BACK_VAL,
			PAD_SOFTKEY_BACK
		}
	};
	memcpy(g_softkey, softkey, sizeof(softkey));

	sPinPadKey_t softkey_bhr[SOFTKEY_SIZE] =
	{
		{
			PINPAD_SOFTKEY_BACK_BHR_LEFT,
			PINPAD_SOFTKEY_BACK_BHR_RIGHT,
			PINPAD_SOFTKEY_BACK_BHR_TOP,
			PINPAD_SOFTKEY_BACK_BHR_BOTTOM,
			PAD_SOFTKEY_BACK_VAL,
			PAD_SOFTKEY_BACK
		}
	};
	memcpy(g_softkey_bhr, softkey_bhr, sizeof(softkey_bhr));
#endif
}