/* Copyright 2023 Dual Tachyon
 * https://github.com/DualTachyon
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *     Unless required by applicable law or agreed to in writing, software
 *     distributed under the License is distributed on an "AS IS" BASIS,
 *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *     See the License for the specific language governing permissions and
 *     limitations under the License.
 */

#ifdef ENABLE_PWRON_PASSWORD

#include <string.h>

#include "ARMCM0.h"
#include "app/uart.h"
#include "audio.h"
#include "driver/keyboard.h"
#include "driver/st7565.h"
#include "misc.h"
#include "settings.h"
#include "ui/helper.h"
#include "ui/inputbox.h"
#include "ui/lock.h"

static void Render(void)
{
	unsigned int i;
	char         String[7];

	memset(g_status_line,  0, sizeof(g_status_line));
	memset(g_frame_buffer, 0, sizeof(g_frame_buffer));

	strcpy(String, "LOCK");
	UI_PrintString(String, 0, 127, 1, 10);
	for (i = 0; i < 6; i++)
		String[i] = (g_input_box[i] == 10) ? '-' : '*';
	String[6] = 0;
	UI_PrintString(String, 0, 127, 3, 12);

	ST7565_BlitStatusLine();
	ST7565_BlitFullScreen();
}

void UI_DisplayLock(void)
{
	unsigned int g_debounce_counter = 0;
//	bool         g_key_being_held   = false;
	key_code_t   g_key_reading_0    = KEY_INVALID;
//	key_code_t   g_key_reading_1;
	key_code_t   Key;
	beep_type_t  Beep;

	g_update_display = true;

	memset(g_input_box, 10, sizeof(g_input_box));

	while (1)
	{
		while (!g_next_time_slice) {}

		// TODO: Original code doesn't do the below, but is needed for proper key debounce

		g_next_time_slice = false;

		Key = KEYBOARD_Poll();

		if (g_key_reading_0 == Key)
		{
			if (++g_debounce_counter == key_debounce_10ms)
			{
				if (Key == KEY_INVALID)
				{
//					g_key_reading_1 = KEY_INVALID;
				}
				else
				{
//					g_key_reading_1 = Key;

					switch (Key)
					{
						case KEY_0:
						case KEY_1:
						case KEY_2:
						case KEY_3:
						case KEY_4:
						case KEY_5:
						case KEY_6:
						case KEY_7:
						case KEY_8:
						case KEY_9:
							INPUTBOX_Append(Key - KEY_0);

							if (g_input_box_index < 6)   // 6 frequency digits
							{
								Beep = BEEP_1KHZ_60MS_OPTIONAL;
							}
							else
							{
								uint32_t Password;

								g_input_box_index = 0;

								NUMBER_Get(g_input_box, &Password);

								if ((g_eeprom.power_on_password * 100) == Password)
								{
									AUDIO_PlayBeep(BEEP_1KHZ_60MS_OPTIONAL);
									return;
								}

								memset(g_input_box, 10, sizeof(g_input_box));

								Beep = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
							}

							AUDIO_PlayBeep(Beep);

							g_update_display = true;
							break;

						case KEY_EXIT:
							if (g_input_box_index > 0)
							{
								g_input_box[--g_input_box_index] = 10;
								g_update_display = true;
							}

							AUDIO_PlayBeep(BEEP_1KHZ_60MS_OPTIONAL);

						default:
							break;
					}
				}

//				g_key_being_held = false;
			}
		}
		else
		{
			g_debounce_counter = 0;
			g_key_reading_0    = Key;
		}

		if (UART_IsCommandAvailable())
		{
			__disable_irq();
			UART_HandleCommand();
			__enable_irq();
		}

		if (g_update_display)
		{
			Render();
			g_update_display = false;
		}
	}
}

#endif
