/**
 * Service Worker — 静态图片资源缓存
 * 策略：首页关键图片预缓存（install 阶段），其余图片运行时 cache-first
 */

const CACHE_NAME = "qycw-static-v1"

// 首页首屏关键图片：install 时提前缓存，消除首次加载白屏
const PRECACHE_URLS = [
  "/logo.png",
  "/favicon.svg",
  "/theme-home/hero-cn2.png",
  "/hero-new-user.jpeg",
  "/theme-home/hero-cloud.jpeg",
  "/hero-cloud.jpg",
  "/theme-home/feature-activity.png",
  "/theme-home/feature-product.png",
  "/theme-home/feature-affiliate.png",
  "/theme-home/feature-compute.png",
  "/solution-website.jpg",
  "/solution-game.png",
  "/solution-enterprise.jpg",
]

// ── Install：预缓存首页关键资源 ────────────────────────────────────────────
self.addEventListener("install", (event) => {
  event.waitUntil(
    caches
      .open(CACHE_NAME)
      .then((cache) =>
        // addAll 任意一个失败不影响整体 SW 安装，用 Promise.allSettled 降级
        Promise.allSettled(
          PRECACHE_URLS.map((url) =>
            cache.add(url).catch(() => {
              // 忽略单个资源失败，不阻断 SW 安装
            }),
          ),
        ),
      ),
  )
  // 安装后立即激活，不等待旧页面关闭
  self.skipWaiting()
})

// ── Activate：清理旧版本缓存 ───────────────────────────────────────────────
self.addEventListener("activate", (event) => {
  event.waitUntil(
    caches.keys().then((keys) =>
      Promise.all(
        keys
          .filter((key) => key !== CACHE_NAME)
          .map((key) => caches.delete(key)),
      ),
    ),
  )
  // 立即接管已打开的页面
  self.clients.claim()
})

// ── Fetch：图片走 cache-first，其余资源不拦截 ─────────────────────────────
const IMAGE_EXT_RE = /\.(png|jpe?g|gif|svg|webp|ico|avif)(\?.*)?$/i

self.addEventListener("fetch", (event) => {
  const { request } = event

  // 只处理 GET 请求
  if (request.method !== "GET") return

  const url = new URL(request.url)

  // 只处理同源资源（不拦截 API、第三方 CDN）
  if (url.origin !== self.location.origin) return

  // 不拦截 API 和 media 代理请求
  if (url.pathname.startsWith("/api/") || url.pathname.startsWith("/media/")) return

  // 图片资源：cache-first
  if (IMAGE_EXT_RE.test(url.pathname)) {
    event.respondWith(
      caches.open(CACHE_NAME).then(async (cache) => {
        const cached = await cache.match(request)
        if (cached) return cached

        // 未命中缓存：从网络获取并存入缓存
        try {
          const response = await fetch(request)
          if (response.ok) {
            // 仅缓存成功响应，避免缓存 404
            cache.put(request, response.clone())
          }
          return response
        } catch {
          // 网络失败且无缓存：返回空响应，避免页面报错
          return new Response("", { status: 408, statusText: "Offline" })
        }
      }),
    )
  }
})
