//
//  SharePlatform.swift
//  ylgamehall
//
//  分享平台抽象 + ShareContent 数据载荷。
//
//  策略模式：微信 / QQ / 抖音 各自实现 SharePlatform 协议，由 ShareCenter
//  按 sharefriend / 用户选择分发。
//
//  **fire-and-forget 语义**：share 调用即认为分享流程已发起；H5 端的
//  sharesuccess 在 FriendsShareHandler 解析参数后立即触发（与原 msext
//  gameController.m 同款"乐观策略"，由用户明示有意为之）。各平台 share()
//  只负责拉起对应 UI / URL Scheme，不再回传结果。
//
//  详见 docs/H5-Native-Implementation-Design.md §8.2 ShareKit。
//

import Foundation
import UIKit

/// 分享内容（H5 → Native 桥的 friendsShare 参数解析后的 Swift 类型）。
/// 项目默认 SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor 让 struct 也跨 actor 受限；
/// 标 nonisolated 让 handler 闭包（@Sendable async）可自由构造与传递。
nonisolated public struct ShareContent: Sendable {
    /// 分享给好友（"1"）还是朋友圈（"2"）
    public let sharefriend: String
    /// msext 旧描述：1 微信 / 2 微信 / 3 闲聊。新代码读了但不用（SharePanel 由用户选平台决定）。
    /// 保留字段以维持契约 §3.1 ［2］兼容性
    public let sharetype: String
    /// 1 链接 / 2 截图 / 其他 = 按链接处理（原 WechatShareManager 行为，无独立远端图分支）
    public let type: String
    /// 链接 URL
    public let webpageUrl: String
    public let title: String
    public let desc: String

    public init(
        sharefriend: String,
        sharetype: String,
        type: String,
        webpageUrl: String,
        title: String,
        desc: String
    ) {
        self.sharefriend = sharefriend
        self.sharetype = sharetype
        self.type = type
        self.webpageUrl = webpageUrl
        self.title = title
        self.desc = desc
    }
}

/// 分享场景：好友 / 朋友圈（仅微信有意义；QQ / 抖音 暂不区分）。
public enum ShareScene: Sendable {
    case friend         // 微信好友 / QQ 好友
    case timeline       // 微信朋友圈 / QQ 空间
}

@MainActor
public protocol SharePlatform: AnyObject {
    /// 平台唯一标识（用于 log）
    var name: String { get }
    /// 平台 app 是否已安装（用于 SharePanel 按钮灰显）
    var isInstalled: Bool { get }
    /// 拉起分享 UI；fire-and-forget，不回传结果（sharesuccess 已在 handler 层先发）
    func share(_ content: ShareContent, scene: ShareScene)
}
