#include "Drv/pages/AppInfo/presenter.h"
#include "Drv/pages/page_manager.h"
#include "Drv/key.h"
#include <string.h>

static void AppInfoPresenter_HandleInput(appinfo_presenter_t *presenter, uint8_t keyVal)
{
    switch (keyVal)
    {
        case KEY_ESC:
            (void)PageManager_Pop();
            break;     
        default: break;
    }
}

/* -------------------------------------------------------------------------
 * 函数名：MenuPresenter_Refresh
 * 功能:
 *   Presenter 层的对外刷新接口，根据是否为首帧渲染选择不同的刷新策略。
 *   本函数作为 menu_presenter_t::refresh 回调被调用，负责协调 View 层完成界面更新。
 *
 * 参数:
 *   presenter    - 菜单 Presenter 实例指针，内部持有 menuCtrl 上下文和 view 接口引用
 *   isFirstFrame - 是否为首帧标志：
 *                   1 - 首帧渲染：需要完整初始化并刷新整个菜单界面
 *                   0 - 非首帧渲染：根据当前状态差异进行增量或局部刷新
 *
 * 刷新策略:
 *   首帧模式 (isFirstFrame == 1):
 *     - 调用 View 层的 full_refresh() 接口，完整重绘整个菜单界面。
 *     - 此时 menuCtrl 中的导航路径、选中项等状态已完成初始化，可安全进行全量渲染。
 *     - MODE_NONE 表示不进行特殊模式过滤（如调试模式、特定层级过滤等）。
 *   
 *   非首帧模式 (isFirstFrame == 0):
 *     - 调用 MenuPresenter_RenderByState() 进行智能状态对比刷新：
 *       1) 比较 pt0Level 与 ptRoute[0]，判断顶层上下文是否切换
 *       2) 比较 ptCurBak 与 ptCurrent，判断选中项是否变化
 *       3) 根据层级关系和父节点关联选择最优渲染策略：
 *          - 同层同父：局部反显更新（旧选中恢复 + 新选中高亮）
 *          - 新层级 >= 旧层级：补绘受影响层级
 *          - 回退到更高层：整页刷新保证一致性
 *     - 此策略可避免不必要的重绘，提升界面响应性能。
 *
 * 调用关系:
 *   - 被 MenuPresenter_HandleInput() 在导航状态变化后调用（isFirstFrame = 0）
 *   - 被外部初始化完成后首次调用（isFirstFrame = 1）
 *   - 通过 presenter->refresh 函数指针绑定，符合 Presenter 的接口抽象。
 *
 * 边界处理:
 *   - 本函数假设 presenter 指针有效，不做空指针校验（由调用方保证）。
 *   - view 接口的 full_refresh() 和内部渲染逻辑负责具体的绘制安全校验。
 * ------------------------------------------------------------------------- */
 static void AppInfoPresenter_Refresh(appinfo_presenter_t *presenter)
 {
    presenter->view->show_top_name(presenter->model->topName);
 }
/* -------------------------------------------------------------------------
 * 函数名: MenuPresenter_Init
 * 功能:
 *   初始化菜单 Presenter 实例，完成依赖绑定、对外接口挂接以及初始导航状态装配。
 *
 * 参数:
 *   presenter - 待初始化的 Presenter 实例
 *   model     - 菜单 Model 实例，提供菜单树与运行时数据
 *   view      - 菜单 View 实例，提供刷新与绘制能力
 *
 * 边界处理:
 *   - 若 `presenter`、`model` 或 `view` 任一为空，则直接返回。
 *
 * 说明:

 *
 * 返回值:
 *   - 无
 * ------------------------------------------------------------------------- */
 void AppInfoPresenter_Init(appinfo_presenter_t *presenter, appinfo_model_t *model, appinfo_view_t *view)
 {
     ASSERT((presenter == NULL) || (model == NULL) || (view == NULL));
     if ((presenter == NULL) || (model == NULL) || (view == NULL))
     {
         return;
     }

     memset(presenter, 0, sizeof(*presenter));
     presenter->model = model;
     presenter->view = view;
     presenter->handle_input = AppInfoPresenter_HandleInput;
     presenter->refresh = AppInfoPresenter_Refresh;
 }