#include "oswald.h"
#include "oswald_watch_faces.h"
#include "Fonts.h"
#include "LcdDisplay.h"

#include "oswald_screens.h"

typedef struct {
	void (*screendraw_func)(boolean shoq_seconds);
	boolean show_seconds;
	boolean analogue;
} idle_data_t;
static idle_data_t idle_screen = {
	DrawLcdDigitalClock,
	FALSE,
	FALSE,
};
 
void idle_handle_user_buttons(watch_button button)
{
	switch (button) {
		case BUTTON_D:
			if (idle_screen.show_seconds)
				idle_screen.show_seconds = FALSE;
			else
				idle_screen.show_seconds = TRUE;
			break;
		case BUTTON_E:
			if (idle_screen.analogue == TRUE) {
				idle_screen.analogue = FALSE;
				idle_screen.screendraw_func = DrawLcdDigitalClock;
			} else {
				idle_screen.analogue = TRUE;
				idle_screen.screendraw_func = DrawLcdAnaClock;
			};
			break;
		default:
			break;
	};
	idle_screen.screendraw_func(idle_screen.show_seconds);
}

void idle_handle_events(u16t event, void *data)
{
	switch (event) {
		case EVENT_ONE_SEC_TIMER:
		case EVENT_SCREEN_VISIBLE:
			idle_screen.screendraw_func(idle_screen.show_seconds);
			break;
		case EVENT_USER_BUTTONS:
			dbg_out("button event %d\n", *(int *)data);
			idle_handle_user_buttons(*(watch_button *)data);
			break;
		default:
			break;
	};
}


void draw_accel_screen(void)
{
	lcd_clear_display();
	SetFont(MetaWatch16);
	WriteLcdString(2, 2, "X:");
	WriteLcdString(20, 2, "123");
	WriteLcdString(2, 18, "Z:");
	WriteLcdString(20, 18, "123");
	WriteLcdString(2, 34, "Y:");
	WriteLcdString(20, 34, "123");
}

void accel_handle_events(u16t event, void *data)
{
	switch (event) {
		case EVENT_SCREEN_VISIBLE:
			draw_accel_screen();
			break;
		case EVENT_USER_BUTTONS:
			dbg_out("button event %d\n", *(int *)data);
			break;
		default:
			break;
	};
}


void draw_datetime_setup_screen(void)
{
	lcd_clear_display();
	SetFont(MetaWatch16);
	WriteLcdString(2, 2, "Date / Time");
	WriteLcdString(2, 18, "Setting");
	WriteLcdString(2, 34, "22:39");
	WriteLcdString(2, 50, "07.08.2012");
}

void datetime_setup_events(u16t event, void *data)
{
	switch (event) {
		case EVENT_SCREEN_VISIBLE:
			draw_datetime_setup_screen();
			break;
		case EVENT_USER_BUTTONS:
			dbg_out("button event %d\n", *(int *)data);
			break;
		default:
			break;
	};
}


typedef struct {
	u8t menu_pos;
} test_menu_t;
static test_menu_t test_menu = { 0 };

void draw_menu_test_screen(void)
{
	lcd_clear_display();
	SetFont(MetaWatch16);
	WriteLcdString(2, 2, "Menu");
	SetFont(MetaWatch7);
	WriteLcdString(2, 20, "Item 1");
	WriteLcdString(2, 29, "Item 2");
	WriteLcdString(2, 38, "Item 3");
	WriteLcdString(2, 47, "Item 4");
	WriteLcdString(2, 56, "Item 5");

	WriteLcdString(50, 20+(9*test_menu.menu_pos), "*");
}

static void handle_menu_user_buttons(watch_button button)
{
	switch (button) {
		case BUTTON_A:
			test_menu.menu_pos--;
			test_menu.menu_pos%=5;
			break;
		case BUTTON_B:
			test_menu.menu_pos++;
			test_menu.menu_pos%=5;
			break;
		default:
			break;
	}
	draw_menu_test_screen();
}

void test_menu_handle_events(u16t event, void *data)
{
	switch (event) {
		case EVENT_USER_BUTTONS:
			dbg_out("button event %d\n", *(int *)data);
			handle_menu_user_buttons(*(watch_button *)data);
			break;
		case EVENT_SCREEN_VISIBLE:
			test_menu.menu_pos = 0;
			draw_menu_test_screen();
			break;
		default:
			break;
	};
}