importScripts(
  'https://storage.googleapis.com/workbox-cdn/releases/6.4.1/workbox-sw.js'
);

let localStorageData = {
  cdns: [],
  disableCDN: true,
};
// yandere sim big files, cuphead, ddlc assets, renpy, renpy, buckshot roulette, half life, undertale & deltarune, hollow knight
let cacheable_files = ["YandereSim.data", "cuphead/Build/Build.data.unityweb.", "/ddlc/game/", "/ddlcplus/game/", "/co09/game/", "/co09flipside/game/", "/co09reup/game/", "renpy.data", "game.zip", "buckshot-roulette.pck", "halva_en-", "game.unx", "bog.data", "FTFHAPort.data.unityweb", "Content.tar.part", "thats-not-my-neighbor.pck", ".unityweb", "index.data.path"];

let no_long_cache_dirs = ["deltarune"];

function isNoLongCachePath(pathname) {
  return no_long_cache_dirs.some(dir => pathname.includes(`/${dir}/`));
}
self.addEventListener("message", e => {
  if (e.data && e.data.type == "localStorage") {
    localStorageData = e.data;
  }
});

if (workbox) {
  self.skipWaiting();
  workbox.core.clientsClaim();
  self.addEventListener("activate", event => {
    event.waitUntil(
      caches.open('resources-cache').then(cache =>
        cache.keys().then(requests =>
          Promise.all(
            requests
              .filter(req => isNoLongCachePath(new URL(req.url).pathname))
              .map(req => cache.delete(req))
          )
        )
      )
    );
  });

  workbox.routing.registerRoute(
    ({ url }) => {
      if (!url.pathname.includes("/resources/")) return false;
      return isNoLongCachePath(url.pathname);
    },
    new workbox.strategies.NetworkFirst({
      cacheName: 'resources-cache-nocache-exceptions',
      networkTimeoutSeconds: 10,
      plugins: [
        new workbox.expiration.ExpirationPlugin({
          maxEntries: 300,
          maxAgeSeconds: 60 * 60,
        }),
      ],
    })
  );

  workbox.routing.registerRoute(
    ({ url }) => {
      if (localStorageData.disableCDN) return false;
      if (localStorageData.cdns.length == 0) return false;
      if (url.origin != location.origin) return false;
      if (!url.pathname.includes("/resources/")) return false;
      for (const file of cacheable_files) {
        if (url.pathname.includes(file)) return true;
      }
      return false;
    },
    async ({ url }) => {
      let cdn = localStorageData.cdns[0];
      console.warn(url.href);
      return Response.redirect(cdn + url.pathname, 302);
    }
  );

  workbox.routing.registerRoute(
    /\.(?:png|gif|jpg|jpeg|svg|webp|avif|gif)$/,
    new workbox.strategies.CacheFirst({
      cacheName: 'images-cache',
      plugins: [
        new workbox.expiration.ExpirationPlugin({
          maxEntries: 1200,
          maxAgeSeconds: 365 * 24 * 60 * 60,
        }),
      ],
    })
  );
  workbox.routing.registerRoute(
    /.*resources\/(semag|sppa).*/,
    new workbox.strategies.CacheFirst({
      cacheName: 'resources-cache',
      plugins: [
        new workbox.expiration.ExpirationPlugin({
          maxEntries: 700,
          maxAgeSeconds: 365 * 24 * 60 * 60,
        }),
      ],
    })
  );

  workbox.routing.registerRoute(
    /.*resources\/(games|apps)\.json$/,
    new workbox.strategies.StaleWhileRevalidate({
      cacheName: 'json-cache',
      plugins: [
        new workbox.expiration.ExpirationPlugin({
          maxAgeSeconds: 3 * 60 * 60,
          maxEntries: 2,
        }),
      ],
    })
  );
};