//
//  VoicePlayingHandler.swift
//  ylgamehall
//
//  H5 → Native handler：voicePlaying — 远端语音播放总开关
//  契约：docs/H5-Native-Contract.md §3.1 ［6］
//
//  开关位由 actor VoiceCenter 持有，跨 handler 共享。Phase 3.F
//  mediaTypeAudio handler 读 isEnabled 决定是否播放。
//

import Foundation
import os.log

/// 远端语音播放总开关（actor 隔离，跨 bridge handler 安全共享）。
///
/// 默认值 `true` 对齐 daoqi NewRootVC.m:255 / gameController.m:343 viewDidLoad
/// 早期 `canbofang=YES` 行为（ObjC BOOL 默认是 NO，但 daoqi 在 VC init 时主动
/// set YES）。
public actor VoiceCenter {
    public static let shared = VoiceCenter()
    public private(set) var isEnabled: Bool = true
    public func setEnabled(_ on: Bool) { isEnabled = on }
}

public enum VoicePlayingHandler {

    nonisolated private static let log = Logger(subsystem: "ylgamehall", category: "VoicePlaying")

    public static func register(on bridge: any BridgeProtocol) {
        // 【6】voicePlaying
        //   入参 int 1=允许 / 其它=静默
        //   cb："voicePlaying"（字面与 handler 名相同，不是 "Response from voicePlaying"）
        bridge.register("voicePlaying") { data, callback in
            // 兼容 H5 传 number 或 string（"1" / 1 / 0 / "0"）。原 asInt 实现遇到
            // string 类型会返回 nil，导致 H5 调 voicePlaying("1") 时被当作 0 关闭开关。
            let raw = data?.asLooseString ?? "<nil>"
            let on = raw == "1"
            Task { await VoiceCenter.shared.setEnabled(on) }
            log.debug("voicePlaying H5 → raw=\(raw, privacy: .public) → isEnabled=\(on, privacy: .public)")
            // 注意回包字面是 "voicePlaying"，不是 "Response from voicePlaying"。
            // 与其它 handler 的 "Response from XXX" 模式不一致是原项目历史包袱
            // （daoqi/msext gameController.m:573、NewRootVC.m:451 都是 responseCallback(@"voicePlaying")）
            callback?(.string("voicePlaying"))
        }
    }
}
