/**
 * @file    myCmd.h
 * @brief   命令处理框架 — 纯 C 接口
 * @details 命令注册/分发/补全。
 *          通过 `__attribute__((constructor))` 实现模块自动注册。
 *          调试命令通过 WebSocket 在前端执行，不占用终端 stdin。
 */
#ifndef _MY_CMD_H_
#define _MY_CMD_H_

#include "myBase.h"

#ifdef __cplusplus
extern "C"
{
#endif

typedef struct
{
    const char *name;
    void (*func)(int argc, char *argv[]);
    const char *desc;
    void (*complete)(const char *buf, char ***completions, int *ncomp);
} stru_cmd;

/** 注册命令 */
void cmd_manager_add_command(const char *name, void (*func)(int argc, char *argv[]),
                              const char *desc, void (*complete)(const char *, char ***, int *));

/** 获取所有已注册命令列表 */
stru_cmd *cmd_manager_get_commands(unsigned int *out_count);

/** 打印帮助信息 */
void cmd_help(int argc, char *argv[]);

/** 按名称查找命令 */
stru_cmd *cmd_find(const char *name);

/** Tab 自动补全回调 */
void cmd_complete(const char *buf, char ***completions, int *ncomp);

/** 子命令补全 */
void cmd_sub_complete(const char *buf, char ***completions, int *ncomp,
                       const char **subs, int sub_count);

/** 注册命令宏（无补全） */
#define CMD_REGISTER(cmd_name, func_ptr, cmd_desc) \
    __attribute__((constructor)) static void register_##func_ptr(void) \
    { \
        cmd_manager_add_command(cmd_name, func_ptr, cmd_desc, NULL); \
    }

/** 注册命令宏（带补全） */
#define CMD_REGISTER_C(cmd_name, func_ptr, cmd_desc, complete) \
    __attribute__((constructor)) static void register_##func_ptr(void) \
    { \
        cmd_manager_add_command(cmd_name, func_ptr, cmd_desc, complete); \
    }

#ifdef __cplusplus
}
#endif
#endif
