/** 模組級樂觀未讀計數（WS 推播先亮紅點，API 同步後再清除） */
let optimisticUnreadCount = 0
let lastMergedHasUnread = false

type UnreadListener = (hasUnread: boolean) => void
const listeners = new Set<UnreadListener>()

function emitMerged(has: boolean) {
    lastMergedHasUnread = has
    for (const listener of listeners) {
        listener(has)
    }
}

function emitOptimisticOnly() {
    emitMerged(optimisticUnreadCount > 0 || lastMergedHasUnread)
}

export function bumpOptimisticUnread(count = 1) {
    optimisticUnreadCount = Math.max(0, optimisticUnreadCount + count)
    emitOptimisticOnly()
}

export function clearOptimisticUnread() {
    if (optimisticUnreadCount === 0) return
    optimisticUnreadCount = 0
    emitOptimisticOnly()
}

export function hasOptimisticUnread(): boolean {
    return optimisticUnreadCount > 0
}

/** API 回傳有未讀時清除樂觀計數；否則保留 WS 尚未入庫的紅點 */
export function mergeUnreadWithApi(apiHasUnread: boolean): boolean {
    if (apiHasUnread) {
        optimisticUnreadCount = 0
    }
    const has = apiHasUnread || optimisticUnreadCount > 0
    emitMerged(has)
    return has
}

export function getUnreadBadgeSnapshot(): boolean {
    return lastMergedHasUnread || optimisticUnreadCount > 0
}

export function subscribeUnreadBadge(listener: UnreadListener): () => void {
    listeners.add(listener)
    listener(getUnreadBadgeSnapshot())
    return () => listeners.delete(listener)
}
