package com.tencent.qian.webview.prewarm

import com.tencent.qian.webview.model.PrewarmLevel

/**
 * 单调去重状态（design.md Decision 4），线程安全。
 *
 * - [PrewarmLevel.MINIMAL]：全局只做一次（`minimalDone`）。
 * - [PrewarmLevel.LIGHT] / [PrewarmLevel.HEAVY]：每 bizType 记录已达最高档；低于等于已达档则不再执行。
 * - 不允许降级重热；仅 manifest version 变化时 [reset] 整体重置。
 */
internal class PrewarmDedup {

    private val reached = HashMap<String, PrewarmLevel>()
    private var minimalDone = false
    private val lock = Any()

    /** 判断本次 `(level, bizType)` 是否应执行（未被去重）。 */
    fun shouldRun(level: PrewarmLevel, bizType: String): Boolean = synchronized(lock) {
        if (level == PrewarmLevel.MINIMAL) {
            return !minimalDone
        }
        val cur = reached[bizType] ?: return true
        return level.ordinal > cur.ordinal
    }

    /**
     * 标记 `(level, bizType)` 已完成，更新已达档（单调不降）。
     *
     * 档位增量补做：任意档位的 `execute` 都会先跑全局 DNS，故完成后**一律置
     * `minimalDone = true`**（含直接调 LIGHT/HEAVY 的情形），避免后续 [PrewarmLevel.MINIMAL] 重复跑 DNS。
     */
    fun markDone(level: PrewarmLevel, bizType: String) = synchronized(lock) {
        // 任意档位执行后 DNS 已做过 → 置 minimalDone
        minimalDone = true
        if (level == PrewarmLevel.MINIMAL) {
            return
        }
        val cur = reached[bizType]
        if (cur == null || level.ordinal > cur.ordinal) {
            reached[bizType] = level
        }
    }

    /** 整体重置（manifest version 变化时调用）。 */
    fun reset() = synchronized(lock) {
        reached.clear()
        minimalDone = false
    }
}
