package com.tencent.qian.webview.internal

import android.annotation.SuppressLint
import android.os.Build
import android.webkit.CookieManager
import android.webkit.WebSettings
import android.webkit.WebView
import com.tencent.qian.webview.TencentQianWebView
import com.tencent.qian.webview.model.TencentQianWebViewConfig

/**
 * DOM Storage + Cookie + 第三方 Cookie + 标准 WebSettings 套用工具。
 *
 * **DOM Storage / Cookie / 第三方 Cookie(强制开启,不开放关闭)**:
 * 1. DOM Storage —— `domStorageEnabled = true`
 * 2. Cookie —— `CookieManager.setAcceptCookie(true)`
 * 3. 第三方 Cookie —— `CookieManager.setAcceptThirdPartyCookies(webView, true)`
 *
 * **iOS 等价**:`WKConfigurationFactory.makeConfiguration(...)`(processPool 单例 + 默认 cookie 共享)。
 */
@Suppress("DEPRECATION")
internal object WebSettingsApplier {

    @SuppressLint("SetJavaScriptEnabled")
    fun apply(webView: WebView, config: TencentQianWebViewConfig) {
        val s = webView.settings

        // ────────── DOM Storage + Cookie + 第三方 Cookie ──────────
        s.javaScriptEnabled = true
        s.domStorageEnabled = true
        CookieManager.getInstance().apply {
            setAcceptCookie(true)
            // ⚠️ 风险提示:Google 计划在 Android 后续版本中逐步禁用第三方 Cookie
            // (类似 Chrome Privacy Sandbox)。当前在 Android 14+ 的部分 WebView 版本中
            // 此设置可能被忽略。若人脸核身跨域回到电子签 H5 时丢失登录态,
            // 需关注 Chrome/WebView 的 Privacy Sandbox 进展并评估替代方案(如 SameSite=None + Secure)。
            setAcceptThirdPartyCookies(webView, true)
        }

        // ────────── 内容混合 ──────────
        s.mixedContentMode = when (config.allowMixedContent) {
            TencentQianWebViewConfig.MixedContentPolicy.NEVER ->
                WebSettings.MIXED_CONTENT_NEVER_ALLOW
            TencentQianWebViewConfig.MixedContentPolicy.ALWAYS ->
                WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
            TencentQianWebViewConfig.MixedContentPolicy.COMPATIBILITY ->
                WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE
        }

        // ────────── 视图缩放 ──────────
        s.useWideViewPort = true
        s.loadWithOverviewMode = true
        // textZoom 锁 100,避免系统字体放大撑爆 H5 布局
        s.textZoom = 100
        s.setSupportZoom(true)
        s.builtInZoomControls = true
        s.displayZoomControls = false

        // ────────── 文件 / 媒体 ──────────
        s.allowFileAccess = false           // 安全:禁 file:// 主框架,避免本地文件被 H5 读
        // 安全:禁 content:// 访问,防止恶意 H5 通过 ContentProvider 读取本地数据。
        // 电子签 H5 无 content:// 访问需求;如客户有特殊场景需开启,
        // 可通过 TencentQianWebViewConfig 扩展配置项控制。
        s.allowContentAccess = false
        s.mediaPlaybackRequiresUserGesture = false   // H5 内 video 自动播放需要

        // ────────── 弹窗 / 多窗口 ──────────
        s.javaScriptCanOpenWindowsAutomatically = false
        s.setSupportMultipleWindows(false)

        // ────────── 缓存 ──────────
        s.cacheMode = WebSettings.LOAD_DEFAULT

        // 数据库等老旧 API 已 deprecated 但部分场景仍读取,留默认即可
        // s.databaseEnabled = true   // API 24+ 默认 true,无需显式设

        // ────────── 字体编码 ──────────
        s.defaultTextEncodingName = "UTF-8"

        // ────────── 渲染优先级 ──────────
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
            @Suppress("DEPRECATION")
            s.setRenderPriority(WebSettings.RenderPriority.HIGH)
        }

        // ────────── User-Agent ──────────
        if (config.injectUserAgent) {
            s.userAgentString = buildUserAgent(s.userAgentString.orEmpty(), config.userAgentExtra)
        }
    }

    /** UA 拼接:`<system-ua> qianwv/<sdkVersion>[ <userAgentExtra>]` */
    fun buildUserAgent(systemUa: String, userAgentExtra: String): String {
        val sb = StringBuilder(systemUa.trim())
        if (sb.isNotEmpty()) sb.append(' ')
        sb.append("qianwv/").append(TencentQianWebView.sdkVersion())
        if (userAgentExtra.isNotBlank()) {
            sb.append(' ').append(userAgentExtra.trim())
        }
        return sb.toString()
    }
}
