/**
 * @file interact_press.c
 * @brief 按键说话交互模式实现
 */

#include "interact/interact_press.h"
#include "engine_internal.h"
#include "protocol/protocol_commands.h"
#include "protocol/agent_message.h"
#include "connection/connection_manager.h"
#include "hal_log.h"

#define TAG "PRESS"

/**
 * @brief 进入 Press 模式
 *
 * 发送协议命令通知服务端进入按键对话模式
 */
static int press_enter(engine_internal_ctx_t *ctx)
{
    if (!ctx) {
        return -1;
    }

    BD_LOGI(TAG, "进入按键说话模式");

    /* 未按键前不上行音频 */
    ctx->press_capturing = false;

    /* 禁用实时 ASR，Press 模式仅在按键区间收音 */
    protocol_send_asr_disable_realtime(ctx);

    return 0;
}

/**
 * @brief 退出 Press 模式
 */
static int press_exit(engine_internal_ctx_t *ctx)
{
    BD_LOGI(TAG, "退出按键说话模式");
    return 0;
}

/**
 * @brief 按键按下 -> 通知服务端开始收音
 */
static void press_on_key_press(engine_internal_ctx_t *ctx)
{
    if (!ctx) {
        return;
    }

    BD_LOGI(TAG, "按键按下, 开始收音");

    /* 允许上行音频 */
    ctx->press_capturing = true;

    /* 正在播放或处理中时按下 -> 先打断 */
    if (ctx->state == AIAGENT_STATE_SPEAKING ||
        ctx->state == AIAGENT_STATE_PROCESSING) {
        char msg_buf[16];
        agent_msg_create_break(msg_buf, sizeof(msg_buf));
        conn_mgr_send_text(ctx, msg_buf);
    }

    /* 通知服务端开始收音 */
    protocol_send_asr_start_longtext(ctx);
}

/**
 * @brief 按键松开 -> 通知服务端结束收音
 */
static void press_on_key_release(engine_internal_ctx_t *ctx)
{
    if (!ctx) {
        return;
    }

    BD_LOGI(TAG, "按键松开, 结束收音");

    /* 停止上行音频 */
    ctx->press_capturing = false;

    /* 通知服务端结束收音 */
    protocol_send_asr_stop_longtext(ctx);
}

/**
 * @brief 长按 -> 打断TTS并开始新收音
 */
static void press_on_key_long_press(engine_internal_ctx_t *ctx)
{
    if (!ctx) {
        return;
    }
    BD_LOGI(TAG, "长按, 打断并收音");

    /* 允许上行音频 */
    ctx->press_capturing = true;

    if (ctx->state == AIAGENT_STATE_SPEAKING ||
        ctx->state == AIAGENT_STATE_PROCESSING) {
        char msg_buf[16];
        agent_msg_create_break(msg_buf, sizeof(msg_buf));
        conn_mgr_send_text(ctx, msg_buf);
    }

    /* 通知服务端开始收音 */
    protocol_send_asr_start_longtext(ctx);
}

/**
 * @brief TTS开始播放 - Press模式下无特殊处理
 */
static void press_on_tts_start(engine_internal_ctx_t *ctx)
{
}

/**
 * @brief TTS播放结束 - Press模式下等待用户按键
 */
static void press_on_tts_end(engine_internal_ctx_t *ctx)
{
    BD_LOGD(TAG, "TTS结束, 等待按键");
}

/* Press模式操作表 */
const interact_mode_ops_t interact_press_ops = {
    .name              = "Press",
    .enter             = press_enter,
    .exit              = press_exit,
    .on_key_press      = press_on_key_press,
    .on_key_release    = press_on_key_release,
    .on_key_long_press = press_on_key_long_press,
    .on_tts_start      = press_on_tts_start,
    .on_tts_end        = press_on_tts_end,
    .on_wakeword       = NULL,
};
