#include "menu.h"

#include "disp/oled.h"          // display
#include "hw/adc.h"             // adc for brightness
#include "ui/ui.h"              // buttons and wifi interface

#include "sensor/adxl345.h"     // info page


static uint8_t menu_idx;
static int     state[MENU_ENTRIES];

static const uint8_t ver[] = "0.2.7c";


// button handlers
void menu_next()
{
    menu_idx++;
    if (menu_idx >= MENU_ENTRIES) {
        menu_idx = 0;
    }
}

void menu_prev()
{
    if (menu_idx == 0) {
        menu_idx = MENU_ENTRIES - 1;
    } else {
        menu_idx--;
    }
}

void menu_ok() {
    switch (menu_idx) {
        case 0: {
            state[0] = !state[0];
            if (state[0]) {
                httpd_start();
            } else {
                httpd_stop();
            }
            break;
        }
        case 2: {
            app_blackout = !app_blackout;
            break;
        }
    }
}

void menu_btn_init()
{
    btn_set_cb(0, menu_prev, 0, 0);
    btn_set_cb(1, menu_next, 0, 0);
    btn_set_cb(2, menu_ok,   0, 0);
    btn_set_cb(3, 0,         0, 0);
}

void menu_init()
{
    menu_idx = 0;

    for (int i = 0; i < MENU_ENTRIES; i++) {
        state[i] = 0;
    }

    // get erectus touches history
}

void menu_tick()
{
    if (menuitem[menu_idx].dispfn) {
        menuitem[menu_idx].dispfn();
    }
}

void menu_draw_title(const char *c)
{
    u8g2_uint_t w;
    
    disp_ptr->setFont(u8g2_font_profont10_tr);
		
    w = disp_ptr->getStrWidth(c);
    disp_ptr->setCursor(8 + 48 - (w >> 1), 6);
    disp_ptr->print(c);
}

void menu_draw_wifi()
{
    u8g2_uint_t w;
    char t[32];
    
    menu_draw_title(menuitem[menu_idx].title);

    
    disp_ptr->setFont(u8g2_font_7x14B_tr);

    sprintf(t, "WiFi Radio: %s", state[0] ? "On" : "Off");
		
    w = disp_ptr->getStrWidth(t);
    disp_ptr->setCursor(8 + 48 - (w >> 1), 21);
    disp_ptr->print(t);

    
    disp_ptr->setFont(u8g2_font_profont10_tr);
    
    strcpy(t, "Browse to 172.16.101.1");

    w = disp_ptr->getStrWidth(t);
    disp_ptr->setCursor(8 + 48 - (w >> 1), 31);
    disp_ptr->print(t);
}

void menu_draw_wifipsk()
{
    u8g2_uint_t w;

    menu_draw_title(menuitem[menu_idx].title);


    disp_ptr->setFont(u8g2_font_7x14B_tr);
		
    w = disp_ptr->getStrWidth(conf_psk2.c_str());
    disp_ptr->setCursor(8 + 48 - (w >> 1), 21);
    disp_ptr->print(conf_psk2);
}

void menu_draw_blackout()
{
    u8g2_uint_t w;
    char t[32];
    
    menu_draw_title(menuitem[menu_idx].title);


    disp_ptr->setFont(u8g2_font_7x14B_tr);

    sprintf(t, "Blackout: %s", app_blackout ? "On" : "Off");
		
    w = disp_ptr->getStrWidth(t);
    disp_ptr->setCursor(8 + 48 - (w >> 1), 21);
    disp_ptr->print(t);


    disp_ptr->setFont(u8g2_font_profont10_tr);

    strcpy(t, "Nice for (what?) sleep");

    w = disp_ptr->getStrWidth(t);
    disp_ptr->setCursor(8 + 48 - (w >> 1), 31);
    disp_ptr->print(t);
}

void menu_draw_info()
{
    char t[32];
    
    menu_draw_title(menuitem[menu_idx].title);

    
    disp_ptr->setFont(u8g2_font_profont10_tr);

    disp_ptr->setCursor(0, 14);
	disp_ptr->printf("TS %d.%d.%d.%d  %d.%d.%d.%d",
        btn_read_raw(0),    btn_read_raw(1),    btn_read_raw(2),    btn_read_raw(3),
        btn_read_counts(0), btn_read_counts(1), btn_read_counts(2), btn_read_counts(3)
    );

	disp_ptr->setCursor(0, 22);
	disp_ptr->printf("Brt %d", adc_val_brightness());

    sprintf(t, "Up %d:%02d.%01d", app_uptime / 60, app_uptime % 60, app_counter / 400);
    disp_ptr->setCursor(127 - disp_ptr->getStrWidth(t), 22);
	disp_ptr->printf(t);
    
    sprintf(t, "Accel x:%+3d y:%+3d z:%+3d", accel.x, accel.y, accel.z);
    disp_ptr->setCursor(0, 30);
    disp_ptr->print(t);
}

void menu_draw_stats()
{
    u8g2_uint_t w;
    char t[32];
    
    menu_draw_title(menuitem[menu_idx].title);

    disp_ptr->setFont(u8g2_font_7x14B_tr);
		
    strcpy(t, "Coming later...?");
    w = disp_ptr->getStrWidth(t);
    disp_ptr->setCursor(8 + 48 - (w >> 1), 21);
    disp_ptr->print(t);
}

void menu_draw_about()
{
    u8g2_uint_t w;
    char t[32];


    disp_ptr->setFont(u8g2_font_profont10_tr);
		
    sprintf(t, "SPACE FORCE  v%s", ver);
    w = disp_ptr->getStrWidth(t);
    disp_ptr->setCursor(12 + 48 - (w >> 1), 6);
    disp_ptr->print(t);

    strcpy(t, "~in a rush edition~");
    w = disp_ptr->getStrWidth(t);
    disp_ptr->setCursor(12 + 48 - (w >> 1), 14);
    disp_ptr->print(t);

    strcpy(t, "badge by:  true");
    w = disp_ptr->getStrWidth(t);
    disp_ptr->setCursor(12 + 48 - (w >> 1), 22);
    disp_ptr->print(t);

    strcpy(t, "dc27.whiskeypirates.com");
    w = disp_ptr->getStrWidth(t);
    disp_ptr->setCursor(12 + 48 - (w >> 1), 30);
    disp_ptr->print(t);
}


const MenuItem menuitem[MENU_ENTRIES] = {
    {"WiFi Status",         menu_draw_wifi},
    {"WiFi Password",       menu_draw_wifipsk},
    {"Disable Lights",      menu_draw_blackout},
    {"Information",         menu_draw_info},
    {"Badge Stats",         menu_draw_stats},
    {"About This Badge",    menu_draw_about}
};