/**
 * @file engine_internal.h
 * @brief 引擎上下文（非公开头文件）
 */

#ifndef CORE_ENGINE_INTERNAL_H
#define CORE_ENGINE_INTERNAL_H

#include "aiagent_types.h"
#include "aiagent_config.h"
#include "hal_mutex.h"
#include "hal_thread.h"
#include "hal_websocket.h"
#include "hal_audio_recorder.h"
#include "hal_audio_player.h"
#include "hal_local_player.h"
#include "audio/audio_codec.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct interact_mgr_ctx  interact_mgr_ctx_t;
typedef struct audio_mgr_ctx     audio_mgr_ctx_t;
typedef struct conn_mgr_ctx      conn_mgr_ctx_t;
typedef struct msg_dispatcher_ctx msg_dispatcher_ctx_t;
typedef struct fc_handler_ctx    fc_handler_ctx_t;

/** 引擎上下文（aiagent_engine_t 的实际类型）*/
typedef struct engine_internal_ctx {
    /* 公开接口拷贝 */
    aiagent_callbacks_t     callbacks;          /* 用户事件回调 */
    aiagent_config_t        config;             /* 引擎配置（深拷贝）*/
    aiagent_state_t         state;              /* 当前状态 */

    /* HAL 句柄 */
    hal_ws_handle_t         ws_handle;          /* WebSocket 连接 */
    hal_recorder_handle_t   recorder_handle;    /* 录音器 */
    hal_player_handle_t     player_handle;      /* 流式播放器 */
    hal_local_player_handle_t local_player_handle; /* 本地播放器 */

    /* 音频编解码（上行编码 / 下行解码，raw16k 直通 / g722） */
    audio_codec_t          *audio_codec;

    /* 子模块上下文 */
    interact_mgr_ctx_t     *interact_mgr;       /* 交互管理器 */
    audio_mgr_ctx_t        *audio_mgr;          /* 音频管理器 */
    conn_mgr_ctx_t         *conn_mgr;           /* 连接管理器 */
    msg_dispatcher_ctx_t   *dispatcher;         /* 消息分发器 */
    fc_handler_ctx_t       *fc_handler;         /* FC 处理器 */

    /* 同步 */
    hal_mutex_t             state_mutex;        /* 状态锁 */

    /* 引擎线程 */
    hal_thread_t            engine_thread;      /* 主消息循环线程 */

    /* 生命周期标志 */
    bool                    initialized;        /* 已初始化 */
    bool                    started;            /* 已启动 */
    volatile bool           reconnecting;       /* 重连线程运行中 */
    int                     reconnect_attempts; /* 当前重试计数 */

    /* 按键说话模式收音门控，按下为 true */
    volatile bool           press_capturing;

    /* UserServer 会话缓存（仅 USERSERVER 模式使用，停止时回调 destroy） */
    char                    userserver_instance_id[32];
} engine_internal_ctx_t;

static inline engine_internal_ctx_t *engine_get_ctx(void *engine)
{
    return (engine_internal_ctx_t *)engine;
}

#ifdef __cplusplus
}
#endif

#endif /* CORE_ENGINE_INTERNAL_H */
