package com.tencent.qian.webview

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.net.Uri
import com.tencent.qian.webview.internal.IntentBridge
import com.tencent.qian.webview.model.SignCallback
import com.tencent.qian.webview.model.TencentQianWebViewConfig

/**
 * **容器模式**:SDK 全包接管,客户 1 行调用即可。
 *
 * **典型用法**:
 * ```kotlin
 * TencentQianWebView.open(
 *     activity = this,
 *     url = signUrl,
 *     config = TencentQianWebViewConfig(topBarTitle = "电子签署"),
 *     callback = object : SignCallback {
 *         override fun onSignResult(result: SignResult) { ... }
 *     }
 * )
 * ```
 *
 * **iOS 等价**:`TencentQianWebView.open(from:url:config:onSignResult:onEvent:)`。
 */
public object TencentQianWebView {

    /**
     * 启动签署容器。
     *
     * 容器内已套用 DOM Storage / Cookie / 第三方 Cookie + scheme 拦截 + UA 注入 + 文件 / 权限 / 下载 / SSL 等全部能力。
     *
     * **单窗口限制**:同一时刻仅支持一个签署容器。如果在上一个容器尚未关闭时再次调用本方法,
     * 旧 callback 会被强制派发 [SignResult.EMPTY] 后释放,以避免回调永久丢失。
     * 请确保前一次签署流程结束(收到 [SignCallback.onSignResult] 或容器已 finish)后再发起新签署。
     */
    @JvmStatic
    @JvmOverloads
    public fun open(
        activity: Activity,
        url: String,
        config: TencentQianWebViewConfig = TencentQianWebViewConfig.DEFAULT,
        callback: SignCallback? = null
    ) {
        // 预热环境错配检测（best-effort，仅告警，不阻断）
        TencentQianWebViewPrewarmer.warnIfEnvironmentMismatch(url)
        IntentBridge.put(callback, config)
        val intent = Intent(activity, TencentQianWebViewActivity::class.java).apply {
            putExtra(TencentQianWebViewActivity.EXTRA_URL, url)
        }
        activity.startActivity(intent)
    }

    /**
     * 启动「自检页」容器,验证客户 App 内 WebView 是否满足电子签 H5 兼容要求。
     *
     * @param customUrl 自检页 URL;`null` 走 SDK 默认 URL
     *                  ([TencentQianWebViewConfig.DEFAULT_COMPATIBILITY_TEST_URL])。
     *                  SDK 默认 beta 环境,兼容性测试无需切生产。
     */
    @JvmStatic
    @JvmOverloads
    public fun openCompatibilityTest(
        activity: Activity,
        customUrl: String? = null,
        config: TencentQianWebViewConfig = TencentQianWebViewConfig.DEFAULT,
        callback: SignCallback? = null
    ) {
        val finalUrl = customUrl
            ?: config.compatibilityTestUrl
            ?: TencentQianWebViewConfig.DEFAULT_COMPATIBILITY_TEST_URL
        open(activity, finalUrl, config.copy(topBarTitle = activity.getString(R.string.qian_compatibility_test_title)), callback)
    }

    /**
     * 工具方法:把当前进程的 SDK 版本号暴露给客户(便于排查)。
     */
    @JvmStatic
    public fun sdkVersion(): String = "1.2.0"

    /** 防御:协助客户判断 URL 是否 SDK 应当处理。 */
    @JvmStatic
    public fun canHandle(uri: Uri?): Boolean {
        val s = uri?.scheme?.lowercase() ?: return false
        return s == "qianapp"
    }

    /** 仅供 Activity 内部使用。 */
    internal fun resolveContext(ctx: Context): Activity? = ctx as? Activity
}
