#include "Vendor_Interface.h"
#include "TZ_Vendor_debug_tl.h"
#include "tl_tui_bc_error_msg.h"

#include "TuiControl.h"
#include "TuiKeypad.h"
#include "TuiButton.h"
#include "TuiTextBox.h"
#include "TuiPng.h"
#include "TuiLayout.h"
#include "TuiScreenResource.h"

#include <string.h>

uint8_t keypadArray[CONTROL_KEYPAD_LINE_COUNT][CONTROL_KEYPAD_COLUMN_COUNT + 1] = {
	{'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '\0'},
	{'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '\0', '\0'},
	{'z', 'x', 'c', 'v', 'b', 'n', 'm', '\0', '\0', '\0', '\0'},
};

Control* initKeypad(Control* control, Location loc) {
	control->id = ID_CONTROL_KEYPAD_LAYOUT;
	control->location = loc;
	control->kindOfControl = KEYPAD_CONTROL_TYPE;
	control->state = ENABLE_CONTROL_STATE;
	control->childCount = CONTROL_KEYPAD_BUTTON_COUNT;
	control->originResource = keypad_resource[img_inapp_in_keypad];//img_inapp_in_keypad;
	control->originResourceSize = keypad_sizes[img_inapp_in_keypad];//sizeof(img_inapp_in_keypad);
	control->eventResource = NULL;
	control->eventResourceSize = 0;
	control->extraResource = NULL;
	control->extraResourceSize = 0;
	getPngWidthAndHeight(control->originResource, &control->width, &control->height);
	control->isTouchable = 0;

	return control;
}

void addKeypad(Control *control) {
	addControl(control);

	Control keypadControl;
	Location loc;
	uint32_t controlId = control->id + 1;

	uint32_t keypadX = control->location.x1 + CONTROL_KEYPAD_SIDE_MARGIN_LEFT;
	uint32_t keypadY = control->location.y1 + CONTROL_KEYPAD_TOP_MARGIN;
	uint32_t keypadLeftMargin = CONTROL_KEYPAD_BUTTON_MARGIN_WIDTH;
	uint32_t keypadTopMargin = CONTROL_KEYPAD_BUTTON_MARGIN_HEIGHT;

	uint32_t keypadWidth = control->width - (CONTROL_KEYPAD_SIDE_MARGIN_LEFT + CONTROL_KEYPAD_SIDE_MARGIN_RIGHT);
	uint32_t columnCount;
	uint32_t startX;

	drawKeypad(control);

	for (uint32_t i = 0; i < CONTROL_KEYPAD_LINE_COUNT; i++) {
		columnCount = (uint32_t)strlen((char *)keypadArray[i]);
		if (columnCount < CONTROL_KEYPAD_COLUMN_COUNT) {
			startX = keypadX + (keypadWidth - (CONTROL_KEYPAD_BUTTON_WIDTH * columnCount)) / 2;
		} else {
			startX = keypadX;
		}
		for (uint32_t j = 0; j < columnCount; j++) {
			loc.x1 = startX + (CONTROL_KEYPAD_BUTTON_WIDTH * j) + keypadLoctionAdjustment[i*10 + j][0];
			loc.y1 = keypadY + (CONTROL_KEYPAD_BUTTON_HEIGHT * i) + keypadLoctionAdjustment[i * 10 + j][1];
			uint32_t fontIndex = keypadArray[i][j] - 'a';
			initButton(&keypadControl, controlId++, loc, 0, 0, 
					keypad_resource[fontIndex + CONTROL_KEYPAD_BUTTON_COUNT], keypad_sizes[fontIndex + CONTROL_KEYPAD_BUTTON_COUNT], keypad_resource[fontIndex], keypad_sizes[fontIndex], NULL, 0, 0);
			keypadControl.charValue = keypadArray[i][j];
			keypadControl.width = CONTROL_KEYPAD_BUTTON_WIDTH;
			keypadControl.height = CONTROL_KEYPAD_BUTTON_HEIGHT;
			keypadControl.imageMargin.x1 = keypadLeftMargin;
			keypadControl.imageMargin.y1 = keypadTopMargin;
			keypadControl.isDrawingWhenAdded = 1;
			addButton(&keypadControl, executeButtonKeypad);
		}
	}

	loc.x1 += (CONTROL_KEYPAD_BUTTON_WIDTH + backspaceLoctionAdjustment[0]);
	loc.y1 += backspaceLoctionAdjustment[1];
	initButton(&keypadControl, ID_CONTROL_KEYPAD_BACK_SPACE, loc, 0, 0, 
			keypad_resource[img_keypad_delete_press], keypad_sizes[img_keypad_delete_press], keypad_resource[img_keypad_delete_normal], keypad_sizes[img_keypad_delete_normal], NULL, 0, 0);
	keypadControl.width = CONTROL_KEYPAD_BACK_SPACE_WIDTH;
	keypadControl.height = CONTROL_KEYPAD_BACK_SPACE_HEIGHT;
	keypadControl.imageMargin.x1 = keypadLeftMargin;
	keypadControl.imageMargin.y1 = keypadTopMargin;
	keypadControl.isDrawingWhenAdded = 1;
	addButton(&keypadControl, executeButtonKeypad);

	return;
}

void drawKeypad(Control *control) {
	drawImage(control->location.x1, control->location.y1, control->originResource, control->originResourceSize);
}

EControlState getKeypadControlState() {
	Node* node = pickingControlById(ID_CONTROL_KEYPAD_LAYOUT);
	if (node == NULL) {
		return NONE_CONTROL_STATE;
	}
	return node->control.state;
}

ResponseControl executeButtonKeypad(Control *control) {
	ResponseControl rc;
	initResponseControl(&rc);

	TTY_LOG("executeButtonKeypad!!");
	switch (control->state) {
	case PRESSED_CONTROL_STATE:
		if (control->eventResource != NULL) {
			drawButton(control);
		}
		break;
	case RELEASED_CONTROL_STATE:
		if (control->id == ID_CONTROL_KEYPAD_BACK_SPACE) {
			deleteChar();
			drawButton(control);
		} else if (control->id > ID_CONTROL_KEYPAD_LAYOUT && control->id < ID_CONTROL_KEYPAD_BACK_SPACE) {
			inputChar(control->charValue);
			drawButton(control);
		}
		else {
			drawButton(control);
		}
		control->state = ENABLE_CONTROL_STATE;
		break;
	default:
		break;
	}

	return rc;
}
