package com.jishisongfu.duobibi.util

import android.content.Context
import android.content.SharedPreferences
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow

/**
 * 关注商品(收藏)持久化。
 *
 * 占坑期不上 Room 表 —— 关注的本质是"id Set",SharedPreferences 一行能搞定。
 * 收藏对象是 [com.jishisongfu.duobibi.ui.discover.DiscoverItem.id](DiscoverItem 的 id
 * 字段),消费方读出 id 集合后再去 `DISCOVER_SEED` 里查。后续要持久化"用户自加"的关注
 * 项(种子之外)时,再升级到 Room。
 *
 * UI 反应式订阅用 [watchedFlow],基于 [SharedPreferences.OnSharedPreferenceChangeListener]
 * 自动触发列表/徽章重算。
 */
object WatchedPrefs {
    private const val PREFS = "duobibi_watched"
    private const val KEY_IDS = "watched_ids"

    private fun prefs(ctx: Context): SharedPreferences =
        ctx.getSharedPreferences(PREFS, Context.MODE_PRIVATE)

    fun watchedIds(ctx: Context): Set<String> =
        prefs(ctx).getStringSet(KEY_IDS, emptySet())?.toSet() ?: emptySet()

    fun isWatched(ctx: Context, id: String): Boolean =
        watchedIds(ctx).contains(id)

    fun count(ctx: Context): Int = watchedIds(ctx).size

    /** Toggle 返回操作后是否被关注(true=新加,false=取消)。 */
    fun toggle(ctx: Context, id: String): Boolean {
        val cur = watchedIds(ctx).toMutableSet()
        val nowWatched = if (cur.contains(id)) {
            cur.remove(id); false
        } else {
            cur.add(id); true
        }
        // putStringSet 必须传新 Set 实例,直接复用 cur 会被某些 ROM 缓存导致不触发 listener。
        prefs(ctx).edit().putStringSet(KEY_IDS, cur.toSet()).apply()
        return nowWatched
    }

    fun clearAll(ctx: Context) {
        prefs(ctx).edit().remove(KEY_IDS).apply()
    }

    /** 反应式订阅 — 监听 [KEY_IDS] 的变化,自动 emit 新集合;首项立即 emit 当前值。 */
    fun watchedFlow(ctx: Context): Flow<Set<String>> = callbackFlow {
        trySend(watchedIds(ctx))
        val p = prefs(ctx)
        val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
            if (key == KEY_IDS) trySend(watchedIds(ctx))
        }
        p.registerOnSharedPreferenceChangeListener(listener)
        awaitClose { p.unregisterOnSharedPreferenceChangeListener(listener) }
    }
}
