#ifndef MENU_def_H
#define MENU_def_H

#include "display.h"

/* layout constants are unified into menu_view */
#define MENU_SIZE_Y (160)
#define MENU_SIZE_X (160)
#define CN_HEIGHT 12
#define CN_ROWSPACE 2
#define LINE_HEIGHT (CN_HEIGHT + CN_ROWSPACE)
#define MENU_XADD 4
#define MENU_YADD 4
#define MENU_WITDTH 7
#define MENU_YMIN 0
#define MENU_YMAX (MENU_SIZE_Y - CN_HEIGHT)


/* -------------------------------------------------------------------------
 * 枚举名: MenuMode
 * 功能:
 *   定义菜单页顶部状态栏显示所使用的运行模式。
 *
 * 枚举值说明:
 *   MODE_NONE                 - 无模式/默认模式
 *   MODE_OVERFLOW_PROTECTION  - 过流保护模式
 *   MODE_LOCAL_FEEDER_SEGMENT - 就地馈线分段模式
 *   MODE_LOCAL_FEEDER_CONTACT - 就地馈线联络模式
 * ------------------------------------------------------------------------- */
typedef enum
{
    MODE_NONE = 0,
    MODE_OVERFLOW_PROTECTION = 1,
    MODE_LOCAL_FEEDER_SEGMENT = 2,
    MODE_LOCAL_FEEDER_CONTACT = 3
} MenuMode;

typedef struct MenuItem MenuItem;
typedef MenuItem *tagPMenuItem;
typedef MenuItem tagMenuItem;

/* -------------------------------------------------------------------------
 * 结构体名: tagMenuModel
 * 功能:
 *   菜单项的静态业务定义数据（名称、属性、参数与动作入口）。
 *
 * 字段说明:
 *   byClass    - 菜单层级（0 表示根层，其它值表示子层级深度）
 *   byName     - 菜单显示名称（UTF-8 字节数组）
 *   byTip      - 菜单提示信息（UTF-8 字节数组）
 *   byAttrib   - 菜单属性标志（读写权限/类型等）
 *   wPassword  - 菜单访问密码或权限码
 *   wPara      - 菜单动作参数（业务扩展字段）
 *   pfnWinProc - 菜单动作回调函数（叶子节点触发）
 * ------------------------------------------------------------------------- */
typedef struct tagMenuModel
{
    uint8_t byClass;
    uint8_t byName[50];
    uint8_t byTip[50];
    uint8_t byAttrib;
    uint16_t wPassword;
    uint16_t wPara;
    FUNCPTR pfnWinProc;
} tagMenuModel;

/* -------------------------------------------------------------------------
 * 结构体名: MenuLinks
 * 功能:
 *   菜单运行时节点的四向链路关系，描述父子与同层前后关系。
 *
 * 字段说明:
 *   higher - 指向父节点
 *   lower  - 指向第一个子节点
 *   before - 指向同层前一个节点
 *   behind - 指向同层后一个节点
 * ------------------------------------------------------------------------- */
typedef struct
{
    MenuItem *higher;
    MenuItem *lower;
    MenuItem *before;
    MenuItem *behind;
} MenuLinks;

/* -------------------------------------------------------------------------
 * 结构体名: MenuRect
 * 功能:
 *   菜单项/菜单框的布局计算结果，供 View 层绘制与反显定位使用。
 *
 * 字段说明:
 *   wPos   - 当前项在本层中的 0 基行号
 *   wNum   - 当前节点拥有的直接子节点总数
 *   wSPosX - 绘制区域左上角 X
 *   wSPosY - 绘制区域左上角 Y
 *   wEPosX - 绘制区域右下角 X
 *   wEPosY - 绘制区域右下角 Y
 * ------------------------------------------------------------------------- */
typedef struct
{
    uint16_t wPos;      /* 当前项在本层中的 0 基行号 */
    uint16_t wNum;      /* 当前节点拥有的直接子节点总数 */
    uint16_t wSPosX;
    uint16_t wSPosY;
    uint16_t wEPosX;
    uint16_t wEPosY;
} MenuRect;

/* -------------------------------------------------------------------------
 * 结构体名: MenuItem
 * 功能:
 *   菜单运行时节点，聚合链路关系、业务定义与布局结果。
 *
 * 字段说明:
 *   links   - 节点拓扑关系（父子/同层）
 *   menuDef - 节点业务定义（名称、属性、回调等）
 *   rect    - 节点绘制位置与层级布局信息
 * ------------------------------------------------------------------------- */
struct MenuItem
{
    MenuLinks links;
    tagMenuModel menuDef;
    MenuRect rect;
};

/* -------------------------------------------------------------------------
 * 结构体名: tagMenuCtrl
 * 功能:
 *   菜单导航与渲染过程中的运行时控制上下文（Presenter 持有）。
 *
 * 字段说明:
 *   ptHead      - 菜单根节点
 *   ptCurrent   - 当前选中节点
 *   ptRoute     - 当前路径路由（按层级保存各级节点，固定深度 4）
 *   ptCurBak    - 上一次选中节点（用于差分刷新）
 *   pt0Level    - 当前顶层节点缓存（用于判断是否需要整页刷新）
 * ------------------------------------------------------------------------- */
typedef struct
{
    tagPMenuItem ptHead;
    tagPMenuItem ptCurrent;
    tagPMenuItem ptRoute[4];
    tagPMenuItem ptCurBak;
    tagPMenuItem pt0Level;
} tagMenuCtrl;

#endif