package com.lila.wakeup

import android.media.AudioFormat

/**
 * KWS APK 全局配置常量。
 *
 * 协议版本：v2.1（详见 KWS唤醒协议-V2.md）
 * 涵盖三类常量：
 *  - 协议常量（Action 名、对端包名、字段键）
 *  - 引擎参数（阈值、平滑、超时、采样率）
 *  - 模型路径（assets 内相对路径）
 */
object Config {

    // ============================================================
    // 一、协议常量
    // ============================================================

    /** 本 APK 包名（自身） */
    const val SELF_PACKAGE = "com.lila.wakeup"

    /** 数字人 APP 包名（已确认 v2.1） */
    const val APP_PACKAGE = "com.qy.lila"

    /** 唤醒事件广播 Action（本 → APP） */
    const val ACTION_WAKEUP = "com.lila.intent.action.WAKEUP"

    /** 暂停 KWS 广播 Action（APP → 本） */
    const val ACTION_KWS_PAUSE = "com.lila.intent.action.KWS_PAUSE"

    /** 恢复 KWS 广播 Action（APP → 本） */
    const val ACTION_KWS_RESUME = "com.lila.intent.action.KWS_RESUME"

    /** WAKEUP Extras: 命中的唤醒词文本 */
    const val EXTRA_KEYWORD = "keyword"

    /** WAKEUP Extras: 命中时间戳（毫秒） */
    const val EXTRA_TIMESTAMP = "timestamp"

    /** WAKEUP Extras: 置信度 [0,1] */
    const val EXTRA_CONFIDENCE = "confidence"

    /** PAUSE Extras: 静默期毫秒数 */
    const val EXTRA_SILENCE_MS = "silence_ms"

    /** PAUSE/RESUME Extras: 调用原因（透传日志） */
    const val EXTRA_REASON = "reason"

    // ============================================================
    // 二、引擎参数
    // ============================================================

    /** PAUSE 默认静默期（v2.1 微调：3000ms 覆盖 RTC 远端音频回灌 + AI TTS 触发延迟） */
    const val DEFAULT_SILENCE_MS = 3000L

    /** APP 漏发 RESUME 时的兜底超时（2 分钟） */
    const val PAUSE_TIMEOUT_MS = 2 * 60 * 1000L

    /** KWS 主阈值（"你好Lila" 主词） */
    const val KWS_THRESHOLD_PRIMARY = 0.85f

    /** KWS 次阈值（其他变体词） */
    const val KWS_THRESHOLD_SECONDARY = 0.80f

    /** 后验平滑：连续 N 帧 confidence > 阈值才算命中 */
    const val SMOOTH_FRAMES = 2

    // ============================================================
    // 三、AudioRecord 配置
    // ============================================================

    /** 采样率（sherpa-onnx 模型固定 16kHz） */
    const val SAMPLE_RATE = 16_000

    /** 单声道 */
    const val CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO

    /** 16-bit PCM */
    const val ENCODING = AudioFormat.ENCODING_PCM_16BIT

    /** 单帧采样点数（10ms 帧 @ 16kHz = 160 samples） */
    const val FRAME_SAMPLES = SAMPLE_RATE / 100

    // ============================================================
    // 四、模型路径（assets 内）
    // ============================================================

    /**
     * 模型目录，与 sherpa-onnx 官方 demo 一致。
     * 切换模型时改这一行 + 对应的 keywords.txt。
     */
    const val MODEL_DIR = "sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01"

    const val MODEL_ENCODER = "$MODEL_DIR/encoder-epoch-12-avg-2-chunk-16-left-64.onnx"
    const val MODEL_DECODER = "$MODEL_DIR/decoder-epoch-12-avg-2-chunk-16-left-64.onnx"
    const val MODEL_JOINER = "$MODEL_DIR/joiner-epoch-12-avg-2-chunk-16-left-64.onnx"
    const val MODEL_TOKENS = "$MODEL_DIR/tokens.txt"
    const val MODEL_KEYWORDS = "$MODEL_DIR/keywords.txt"

    // ============================================================
    // 五、通知栏
    // ============================================================

    const val NOTIF_CHANNEL_ID = "lila_wakeup_kws"
    const val NOTIF_CHANNEL_NAME = "Lila 语音唤醒"
    const val NOTIF_ID = 1
}
