#ifndef PAGE_MANAGER_H
#define PAGE_MANAGER_H

#include "page.h"

/* -------------------------------------------------------------------------
 * 结构体名: page_manager_t
 * 作用:
 *   页面管理器运行时上下文，维护“页面栈 + 页面注册表”两套核心状态。
 *
 * 设计说明:
 *   - page_stack:
 *       运行时导航栈，表示当前页面跳转路径。
 *       栈顶元素是当前可见/可交互页面。
 *   - stack_top:
 *       栈顶索引。约定 -1 表示空栈。
 *       当前栈深可由 (stack_top + 1) 推导。
 *   - page_registry:
 *       可导航页面的注册表，按 page_id 查找目标页面时使用。
 *   - page_count:
 *       当前注册表有效页面数量，范围 [0, MAX_PAGE_COUNT]。
 *
 * 约束关系:
 *   - page_stack 最大深度由 MAX_PAGE_STACK_DEPTH 限制；
 *   - page_registry 最大容量由 MAX_PAGE_COUNT 限制；
 *   - 调用方需通过 PageManager_Init 初始化后再使用。
 * ------------------------------------------------------------------------- */
 #define MAX_PAGE_STACK_DEPTH 5
 #define MAX_PAGE_COUNT 16

/* -------------------------------------------------------------------------
 * 枚举名: page_manager_result_t
 * 作用:
 *   定义 PageManager 相关接口的统一返回码，避免使用无语义的裸整数。
 *
 * 取值说明:
 *   PAGE_MANAGER_OK                - 操作成功
 *   PAGE_MANAGER_ERR_NULL_PARAM    - 传入参数为空
 *   PAGE_MANAGER_ERR_INVALID_ID    - 页面 ID 非法
 *   PAGE_MANAGER_ERR_NOT_FOUND     - 目标页面未注册/未找到
 *   PAGE_MANAGER_ERR_STACK_FULL    - 页面栈已满，无法继续压栈
 *   PAGE_MANAGER_ERR_STACK_BOTTOM  - 页面栈已到栈底，无法继续弹栈
 *   PAGE_MANAGER_ERR_REGISTRY_FULL - 页面注册表已满
 *   PAGE_MANAGER_ERR_NO_ACTIVE_PAGE - 当前无活动页面可供分发/循环驱动
 * ------------------------------------------------------------------------- */
typedef enum
{
    PAGE_MANAGER_OK = 0,
    PAGE_MANAGER_ERR_NULL_PARAM = -1,
    PAGE_MANAGER_ERR_INVALID_ID = -2,
    PAGE_MANAGER_ERR_NOT_FOUND = -3,
    PAGE_MANAGER_ERR_STACK_FULL = -4,
    PAGE_MANAGER_ERR_STACK_BOTTOM = -5,
    PAGE_MANAGER_ERR_REGISTRY_FULL = -6,
    PAGE_MANAGER_ERR_NO_ACTIVE_PAGE = -7
} page_manager_result_t;

 typedef struct
{
    page_t *page_stack[MAX_PAGE_STACK_DEPTH]; /* 页面导航栈 */
    int8_t stack_top;                         /* 栈顶索引（-1 表示空栈） */
    page_t *page_registry[MAX_PAGE_COUNT];    /* 页面注册表 */
    uint8_t page_count;                       /* 注册页面数量 */
} page_manager_t;

void PageManager_Init(void);
page_manager_result_t PageManager_Register(page_t *page);
page_manager_result_t PageManager_Navigate(page_id_t pageId);
page_manager_result_t PageManager_Replace(page_id_t pageId);
page_manager_result_t PageManager_DispatchEvent(input_event_t *event);

page_t *PageManager_GetTop(void);
page_manager_result_t PageManager_Push(page_t *newPage);
page_manager_result_t PageManager_Pop(void);
page_t *PageManager_Find(page_id_t pageId);
void PageManager_Loop(void);

#endif
