// mock 识别驱动：按固定节奏播放假 partial/final 序列，模拟 WS 下行文本帧。
//
// 14C 时位于 KeyboardExt/ 驱动键盘内演示；14D 起键盘扩展不再跑它
// （1A spike 实证键盘扩展进程内无法录音，语音主路径改为 deep link 去主 App 听写），
// 移到 Shared/ 供主 App 听写页（DictationView）在 DEBUG + Api.offlineMock 时
// 代替「真实录音 + WS 推流」，无后端也能演示全流程。文件按任务要求保留。
import Foundation

final class MockAsrDriver {
    /// 假装是 WS 下行文本帧
    var onMessage: ((DuduProtocol.ServerMsg) -> Void)?

    private var timer: Timer?
    private var step = 0

    /// 模拟流式识别：partial 整帧替换、final 句子级定稿
    private static let script: [(type: String, text: String)] = [
        (DuduProtocol.ServerMsgType.partial, "今天"),
        (DuduProtocol.ServerMsgType.partial, "今天下午"),
        (DuduProtocol.ServerMsgType.partial, "今天下午三点开个会"),
        (DuduProtocol.ServerMsgType.final, "今天下午三点开个会，"),
        (DuduProtocol.ServerMsgType.partial, "记得"),
        (DuduProtocol.ServerMsgType.partial, "记得带上设计稿"),
        (DuduProtocol.ServerMsgType.final, "记得带上设计稿，"),
        (DuduProtocol.ServerMsgType.partial, "还有"),
        (DuduProtocol.ServerMsgType.partial, "还有上次的数据"),
    ]

    func start() {
        stop()
        step = 0
        timer = Timer.scheduledTimer(withTimeInterval: 0.4, repeats: true) { [weak self] _ in
            guard let self else { return }
            guard self.step < Self.script.count else { return } // 播完保持最后状态，等松开
            let item = Self.script[self.step]
            self.step += 1
            self.onMessage?(DuduProtocol.ServerMsg(
                type: item.type, sessionID: "mock-session", text: item.text))
        }
    }

    func stop() {
        timer?.invalidate()
        timer = nil
    }
}
