/**
 * 图片预加载工具
 * 在浏览器空闲时段提前下载图片，配合 Service Worker 缓存，
 * 让轮播切换、滚动到下方区块时图片已就绪，避免加载闪烁。
 */

// 记录已发起预加载的 URL，避免重复请求
const preloaded = new Set<string>()

function preloadOne(src: string) {
  if (!src || preloaded.has(src)) return
  preloaded.add(src)
  const img = new Image()
  img.decoding = "async"
  img.src = src
}

type IdleWindow = Window & {
  requestIdleCallback?: (cb: () => void, opts?: { timeout: number }) => number
}

/**
 * 在浏览器空闲时预加载一组图片。
 * 不支持 requestIdleCallback 的环境降级为 setTimeout。
 */
export function preloadImagesWhenIdle(sources: string[]) {
  const urls = sources.filter(Boolean)
  if (urls.length === 0) return

  const run = () => urls.forEach(preloadOne)
  const idleWindow = window as IdleWindow

  if (typeof idleWindow.requestIdleCallback === "function") {
    idleWindow.requestIdleCallback(run, { timeout: 2000 })
  } else {
    window.setTimeout(run, 300)
  }
}
