import Foundation
import WebKit

/// 工厂方法:为 SDK 内 WKWebView 创建标准 ``WKWebViewConfiguration``。
///
/// **关键配置**:
/// - `processPool` = `TencentQianWebViewShared.processPool`(共享 cookie / 第三方 cookie)
/// - `allowsInlineMediaPlayback` = true(人脸核身活体检测要求 video 内联播放)
/// - `mediaTypesRequiringUserActionForPlayback` = []
/// - `WKWebpagePreferences.allowsContentJavaScript` = true(iOS 14+ 推荐写法)
///
/// **iOS 等价**:Android `WebSettingsApplier`(DOM Storage / Cookie / 第三方 Cookie 由 ``WKProcessPool`` 共享 + WKWebsiteDataStore 默认实现)。
public enum WKConfigurationFactory {

    public static func makeConfiguration(_ config: TencentQianWebViewConfig) -> WKWebViewConfiguration {
        return makeConfiguration(injectUserAgent: config.injectUserAgent, userAgentExtra: config.userAgentExtra)
    }

    /// UA 参数重载：供预热池按 ``PrewarmConfig`` 的 UA 配置离屏创建实例，
    /// 保证 `warmupUrl` 请求的 UA 与 `open()` 的 config UA 一致（缓存命中 + 复用门控）。
    public static func makeConfiguration(injectUserAgent: Bool, userAgentExtra: String) -> WKWebViewConfiguration {
        let conf = WKWebViewConfiguration()
        conf.processPool = TencentQianWebViewShared.processPool
        conf.allowsInlineMediaPlayback = true
        conf.mediaTypesRequiringUserActionForPlayback = []

        // JS 默认启用（版本自适应）
        // iOS 14+: WKWebpagePreferences.allowsContentJavaScript（推荐路径）
        // iOS 11-13: preferences.javaScriptEnabled（旧 API）
        if #available(iOS 14, *) {
            let prefs = WKWebpagePreferences()
            prefs.allowsContentJavaScript = true
            conf.defaultWebpagePreferences = prefs
        } else {
            conf.preferences.javaScriptEnabled = true
        }

        // 默认数据存储(共享 cookie)
        conf.websiteDataStore = .default()

        // UA 注入:必须在 WKWebView 创建之前设置在 configuration 上,
        // 因为 WKWebView.configuration 返回的是 copy,创建后再修改不生效。
        if injectUserAgent {
            var segment = "qianwv/\(TencentQianWebView.sdkVersion)"
            let extra = userAgentExtra.trimmingCharacters(in: .whitespaces)
            if !extra.isEmpty {
                segment += " \(extra)"
            }
            conf.applicationNameForUserAgent = segment
        }

        return conf
    }
}
