/**
 * @file state_machine.h
 * @brief 引擎状态机
 */

#ifndef CORE_STATE_MACHINE_H
#define CORE_STATE_MACHINE_H

#include "aiagent_types.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct engine_internal_ctx engine_internal_ctx_t;

/** 状态机事件 */
typedef enum {
    SM_EVT_CONNECT_REQUEST = 0,     /* 请求建连 */
    SM_EVT_CONNECTED,               /* WebSocket 已连接 */
    SM_EVT_DISCONNECTED,            /* WebSocket 断开 */
    SM_EVT_AUTH_SUCCESS,            /* 鉴权通过 */
    SM_EVT_AUTH_FAIL,               /* 鉴权失败 */
    SM_EVT_START_LISTEN,            /* 开始录音 */
    SM_EVT_STOP_LISTEN,             /* 停止录音 */
    SM_EVT_ASR_RESULT,              /* ASR 结果 */
    SM_EVT_AI_RESPONSE_START,       /* AI 回复开始 */
    SM_EVT_AI_RESPONSE_END,         /* AI 回复结束 */
    SM_EVT_INTERRUPT,               /* 用户打断 */
    SM_EVT_INTERRUPT_DONE,          /* 打断处理完成 */
    SM_EVT_TTS_BEGIN,               /* TTS 开始播放 */
    SM_EVT_TTS_END,                 /* TTS 播放结束 */
    SM_EVT_TIMEOUT,                 /* 对话超时 */
    SM_EVT_ERROR,                   /* 错误 */
    SM_EVT_EXIT,                    /* 引擎退出 */
    SM_EVT_MAX
} state_machine_event_t;

/** 状态变更回调 */
typedef void (*state_change_cb_t)(aiagent_state_t old_state,
                                  aiagent_state_t new_state,
                                  void *user_ctx);

/**
 * @brief 初始化状态机
 * @param on_change 状态变更回调（可为 NULL）
 */
int state_machine_init(engine_internal_ctx_t *ctx,
                       state_change_cb_t on_change,
                       void *user_ctx);

/**
 * @brief 投递事件（线程安全）
 * @return 0 成功，负值表示非法转换
 */
int state_machine_post_event(engine_internal_ctx_t *ctx, state_machine_event_t event);

/** @brief 获取当前状态 */
aiagent_state_t state_machine_get_state(engine_internal_ctx_t *ctx);

/** @brief 重置为 IDLE */
void state_machine_reset(engine_internal_ctx_t *ctx);

/** @brief 反初始化 */
void state_machine_deinit(engine_internal_ctx_t *ctx);

#ifdef __cplusplus
}
#endif

#endif /* CORE_STATE_MACHINE_H */
