#ifndef __MENU_H__
#define __MENU_H__

#include "key.h"
#include "sh1106.h"
#include <stdio.h>
#include "aos/kernel.h"
extern uint8_t g_haasedu_boardname;
extern int g_haasboard_is_k1c;

typedef int MENU_ID_TYP;

#ifdef EDU_TAG
#undef EDU_TAG
#endif
#define EDU_TAG "eduk1_demo"
typedef enum {
    MENU_TASK_IDLE,
    MENU_TASK_RUNNING,
    MENU_TASK_INITING,
    MENU_TASK_UNINITING
} MENU_TASK_STATE_ENU;

typedef struct {
    int (*pMenuTaskInit)(void);
    int (*pMenuTaskEnd)(void);
    // user don't need to care
    MENU_TASK_STATE_ENU menu_task_state;
} MENU_TASK_TYP;

typedef enum {
    MENU_COVER_NONE,
    MENU_COVER_TEXT,
    MENU_COVER_IMG,
    MENU_COVER_FUNC,
} MENU_COVER_MODE_ENU;

typedef struct {
    MENU_COVER_MODE_ENU MenuCoverMode;
    char *text;
    icon_t *img;
    void (*draw_func)(int *);
    int draw_index;
} MENU_COVER_TYP;

typedef struct {
    struct MenuTyp **pMenuList;
    uint8_t          MenuListSize;
} MENU_LIST_TYP;

typedef struct MenuTyp {
    char *MenuName;                  // 菜单名称字符串
    MENU_COVER_TYP *MenuCover;                 // 封面
    MENU_TASK_TYP *pMenuTask;                  // 指向菜单任务的指针
    void (*pTaskKeyDeal)(key_code_t key_code); // 指向菜单任务按键处理函数的指针
    struct MENU_LIST_TYP *pChildrenList; // 指向子菜单列表的指针

    // user don't need to care
    MENU_ID_TYP     MenuID;
    struct MenuTyp *pParent; // 指向上层菜单的指针
    struct MenuTyp *pChild; // 指向子菜单的指针
    struct MenuTyp *pRight; // 指向右菜单的指针
    struct MenuTyp *pLeft;  // 指向左菜单的指针
} MENU_TYP;

void menu_init(void);
static void public_key_event_handle(key_code_t key_code);
static void menu_key_event_handle(key_code_t key_code);
static void menu_show_cover_task(void);
static int menu_task_start(MENU_TYP *pMenu);
static int menu_task_exit(MENU_TYP *pMenu);

static uint8_t icon_data_skip_left[16] = {0x00, 0x00, 0x80, 0x60, 0x18, 0x04,
                                          0x02, 0x00, 0x00, 0x00, 0x01, 0x06,
                                          0x18, 0x20, 0x40, 0x00};
static icon_t  icon_skip_left          = {icon_data_skip_left, 8, 16};

static uint8_t icon_data_skip_right[16] = {0x00, 0x02, 0x04, 0x18, 0x60, 0x80,
                                           0x00, 0x00, 0x00, 0x40, 0x20, 0x18,
                                           0x06, 0x01, 0x00, 0x00};
static icon_t  icon_skip_right          = {icon_data_skip_right, 8, 16};

static uint8_t icon_data_error_ufo[75] = {
    0x18, 0x24, 0x00, 0x18, 0x24, 0x00, 0x18, 0x38, 0x2A, 0xFB, 0x3B,
    0x2B, 0xBB, 0x3B, 0x2B, 0xFB, 0x3A, 0x38, 0x18, 0x00, 0x24, 0x18,
    0x00, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x80, 0x00, 0xA8, 0x00, 0xAA, 0x00, 0xA8, 0x00, 0x80, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xA8,
    0xA8, 0x02, 0xF8, 0x2A, 0xD0, 0x02, 0xF8, 0x2A, 0xD0, 0x02, 0x70,
    0x8A, 0x70, 0x02, 0xF8, 0x28, 0xD0, 0x00, 0x00, 0x00};
static icon_t icon_error_ufo = {icon_data_error_ufo, 25, 24};

static uint8_t icon_data_loadlines0_32_32[] = {
    0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0xC0, 0xE0, 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x81, 0x83, 0x87, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x04, 0x8E, 0x87, 0x83, 0x81, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81,
    0xC1, 0xE1, 0x71, 0x20, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00,
    0x20, 0x71, 0xE1, 0xC1, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    0x03, 0x07, 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00};
static icon_t icon_loadlines0_32_32 = {icon_data_loadlines0_32_32, 32, 32};

static uint8_t icon_data_loadlines1_32_32[] = {
    0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x81, 0x83, 0x87, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x07,
    0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81,
    0xC1, 0xE1, 0x71, 0x20, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00,
    0x20, 0x71, 0xE1, 0xC1, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    0x03, 0x07, 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00};
static icon_t icon_loadlines1_32_32 = {icon_data_loadlines1_32_32, 32, 32};

static uint8_t icon_data_loadlines2_32_32[] = {
    0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0xC0, 0xE0, 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x81, 0x83, 0x87, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x07,
    0x07, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81,
    0xC1, 0xE1, 0x71, 0x20, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00,
    0x20, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    0x03, 0x07, 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00};
static icon_t icon_loadlines2_32_32 = {icon_data_loadlines2_32_32, 32, 32};

static uint8_t icon_data_loadlines3_32_32[] = {
    0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0xC0, 0xE0, 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x81, 0x83, 0x87, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x07,
    0x07, 0x00, 0x00, 0x00, 0x04, 0x8E, 0x87, 0x83, 0x81, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81,
    0xC1, 0xE1, 0x71, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x20, 0x71, 0xE1, 0xC1, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    0x03, 0x07, 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00};
static icon_t icon_loadlines3_32_32 = {icon_data_loadlines3_32_32, 32, 32};

static uint8_t icon_data_loadlines4_32_32[] = {
    0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0xC0, 0xE0, 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x81, 0x83, 0x87, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x07,
    0x07, 0x00, 0x00, 0x00, 0x04, 0x8E, 0x87, 0x83, 0x81, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81,
    0xC1, 0xE1, 0x71, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x20, 0x71, 0xE1, 0xC1, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    0x03, 0x07, 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00};
static icon_t icon_loadlines4_32_32 = {icon_data_loadlines4_32_32, 32, 32};

static uint8_t icon_data_loadlines5_32_32[] = {
    0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0xC0, 0xE0, 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x81, 0x83, 0x87, 0x8E, 0x04, 0x00, 0x00, 0x00, 0x07,
    0x07, 0x00, 0x00, 0x00, 0x04, 0x8E, 0x87, 0x83, 0x81, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
    0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00,
    0x20, 0x71, 0xE1, 0xC1, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    0x03, 0x07, 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00};
static icon_t icon_loadlines5_32_32 = {icon_data_loadlines5_32_32, 32, 32};

static uint8_t icon_data_loadlines6_32_32[] = {
    0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0xC0, 0xE0, 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x07,
    0x07, 0x00, 0x00, 0x00, 0x04, 0x8E, 0x87, 0x83, 0x81, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0xC0, 0xE0, 0x70, 0x20, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00,
    0x20, 0x71, 0xE1, 0xC1, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    0x03, 0x07, 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00};
static icon_t icon_loadlines6_32_32 = {icon_data_loadlines6_32_32, 32, 32};

static uint8_t icon_data_loadlines7_32_32[] = {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
    0xC0, 0xE0, 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07,
    0x07, 0x00, 0x00, 0x00, 0x04, 0x8E, 0x87, 0x83, 0x81, 0x80, 0x80, 0x80,
    0x80, 0x80, 0x80, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81,
    0xC1, 0xE1, 0x71, 0x20, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00,
    0x20, 0x71, 0xE1, 0xC1, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    0x03, 0x07, 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00};
static icon_t icon_loadlines7_32_32 = {icon_data_loadlines7_32_32, 32, 32};

#endif
