//
//  FriendsShareHandler.swift
//  ylgamehall
//
//  H5 → Native handler：friendsSharetypeUrlToptitleDescript — 分享
//  契约：docs/H5-Native-Contract.md §3.1 ［2］ + §3.2 ［11］sharesuccess
//
//  完整流程（与 msext gameController.m:575-597 等价）：
//    1. 入参解析 ShareContent
//    2. ShareCenter.dispatch：
//       - sharefriend == "1" → SharePanel 三选一（微信好友 / QQ / 抖音）
//       - sharefriend == "2" → 直接 WechatShare 朋友圈
//    3. 分享完成 → bridge.call("sharesuccess", { success: "2", type: <sharefriend 原值> })
//
//  各平台 SDK 依赖：
//    - 微信：Phase 4.E 接入项目方 SDK（当前 WechatShare 是 stub）
//    - QQ + 抖音：不依赖 SDK，走 URL Scheme（Phase 4.C/4.D 真实落地，当前 stub）
//

import Foundation

@MainActor
public enum FriendsShareHandler {

    public static func register(on bridge: any BridgeProtocol) {
        // 【2】friendsSharetypeUrlToptitleDescript
        //   入参：sharefriend / sharetype / type / webpageUrl / title / description
        //   cb: "sharefriend"（msext 字面，沿用）
        //   反向 callback：sharesuccess({ success: "2", type: sharefriend 原值 })
        bridge.register("friendsSharetypeUrlToptitleDescript") { [weak bridge] data, callback in
            callback?(.string("sharefriend"))

            guard let obj = data?.asObject else { return }
            let content = ShareContent(
                sharefriend: obj["sharefriend"]?.asString ?? "1",
                sharetype:   obj["sharetype"]?.asString ?? "",
                type:        obj["type"]?.asString ?? "1",
                webpageUrl:  obj["webpageUrl"]?.asString ?? "",
                title:       obj["title"]?.asString ?? "",
                desc:        obj["description"]?.asString ?? ""
            )
            let sharefriend = content.sharefriend

            await MainActor.run {
                ShareCenter.dispatch(content) { result in
                    // success / cancelled / notInstalled / failed — msext 行为：
                    // 只要不是明确失败就发 sharesuccess（乐观策略，URL Scheme 无返回）
                    switch result {
                    case .success, .cancelled:
                        bridge?.call("sharesuccess",
                                     data: .object([
                                         "success": .string("2"),
                                         "type":    .string(sharefriend)
                                     ]),
                                     callback: nil)
                    case .notInstalled, .failed:
                        // 不发 sharesuccess（H5 业务期 timeout 后自行 fallback）
                        break
                    }
                }
            }
        }
    }
}
