//
//  BundleConfig.swift
//  ylgamehall
//
//  渠道注入配置：从 Bundle 内的 ChannelConfig.plist 读 11 个 string 值。
//  设计模式与契约见 docs/H5-Native-Implementation-Design.md §7 / ADR-007。
//
//  注：
//  - 原有 qiniudomain 字段已于 2026-06-27 移除，七牛 CDN 域名改由
//    RemoteConfig 顶层 audio_domain 单一权威源动态下发。
//  - 新增 multishare 字段：控制子游戏 sharefriend=1 好友分享的形态
//    ("1" = SharePanel 三选一 / "0" = 仅微信直发)。
//

import Foundation

/// 渠道注入配置（11 项），由 `BundleConfig.shared` 在 App 启动时一次性加载，运行期不变。
///
/// 多渠道分发：构建后用 `plutil` 修改 `.app/ChannelConfig.plist` + 重签，
/// 不需要重新 Xcode build。详见 ADR-007。
nonisolated public final class BundleConfig: Sendable {

    /// App 启动期默认读 main bundle 的 `ChannelConfig.plist`，业务代码统一通过此单例访问。
    public static let shared = BundleConfig()

    public let gameId:      String
    public let channel:     String
    public let gameDir:     String
    public let gameStart:   String
    public let gameConfig:  String
    public let market:      String
    public let agent:       String
    public let appVersion:  String
    public let other:       String
    public let appleConfig: String
    /// 子游戏内 sharefriend=1 好友分享的形态开关（渠道级）：
    ///   "1" → SharePanel 三选一（微信 / QQ / 抖音，当前默认行为）
    ///   "0" → 关闭三分享，直接走微信分享（不弹面板）
    /// 缺失或其他值视为 "1"（默认开启，兼容旧行为）。
    public let multiShare:  String

    /// 是否启用 SharePanel 三选一。等价 `multiShare != "0"`；
    /// 空字符串 / 缺失字段视为启用（默认行为）。
    public var isMultiShareEnabled: Bool {
        multiShare != "0"
    }

    /// 单测可注入任意 bundle 验证不同 plist fixture。
    public init(bundle: Bundle = .main) {
        let dict = Self.loadPlist(bundle: bundle)
        gameId      = dict["gameid"]       ?? ""
        channel     = dict["channel"]      ?? ""
        gameDir     = dict["gamedir"]      ?? ""
        gameStart   = dict["gamestart"]    ?? ""
        gameConfig  = dict["gameconfig"]   ?? ""
        market      = dict["market"]       ?? ""
        agent       = dict["agent"]        ?? ""
        appVersion  = dict["appversion"]   ?? ""
        other       = dict["other"]        ?? ""
        appleConfig = dict["appleconfig"]  ?? ""
        multiShare  = dict["multishare"]   ?? ""
    }

    private static func loadPlist(bundle: Bundle) -> [String: String] {
        guard let url = bundle.url(forResource: "ChannelConfig", withExtension: "plist"),
              let data = try? Data(contentsOf: url),
              let plist = try? PropertyListSerialization.propertyList(
                  from: data, format: nil) as? [String: String]
        else { return [:] }
        return plist
    }
}
