//
//  SwitchOverGameHandler.swift
//  ylgamehall
//
//  H5 → Native handler：SwitchOverGameData — 切换到子游戏。
//  契约：docs/H5-Native-Contract.md §3.1 ［17］
//
//  与 msext NewRootVC.m:541-566 等价：
//    - 解析 Gamedirectory / gamedownloadurl / data
//    - 2s 节流（msext one_Time / canbackone；本项目挪到 AppCoordinator.showSubGame）
//    - 调 AppCoordinator.shared.showSubGame(...) push 子游戏 VC
//    - 无论 push 是否成功，都回 callback "SwitchOverGameData"（msext 行为）
//
//  ⚠️ 入参字段名严格保持字面：
//    - "Gamedirectory" G 大写
//    - "gamedownloadurl" 全小写
//    - "data" 透传给子游戏 H5（commit C 通过 .subGameDidReturn 反向 callback getWebdata）
//

import Foundation

public enum SwitchOverGameHandler {

    public static func register(on bridge: any BridgeProtocol) {
        // 【17】SwitchOverGameData
        //   入参 type / Gamedirectory / gamedownloadurl / data
        //   cb: "SwitchOverGameData"（驼峰首字母大写，沿用 msext 字面）
        bridge.register("SwitchOverGameData") { data, callback in
            await MainActor.run {
                let dir   = data?["Gamedirectory"]?.asString  ?? ""
                let url   = data?["gamedownloadurl"]?.asString ?? ""
                let web   = data?["data"]?.asString             ?? ""

                // msext 行为：gameStart 沿用 Gamedirectory（同名同目录），
                // 后续若契约出现独立 gamestart 字段再扩展。
                let request = SubGameRequest(
                    gameDir:     dir,
                    gameStart:   dir,
                    downloadURL: url,
                    webData:     web
                )
                AppCoordinator.shared.showSubGame(request)
            }
            // 与 msext 一致：节流命中 / 入参缺失也回 cb，避免 H5 业务期等待
            callback?(.string("SwitchOverGameData"))
        }
    }
}
