import JSZip from "jszip";

async function fetchZipAndGetBlobs(src) {
  const zip = await fetch(src)
    .then(r => r.blob())
    .then(JSZip.loadAsync);

  // Rewrite any url refferences in the GLTF to blob urls
  const fileMap = {};
  const files = Object.values(zip.files);
  const fileBlobs = await Promise.all(files.map(f => f.async("blob")));
  for (let i = 0; i < fileBlobs.length; i++) {
    fileMap[files[i].name] = URL.createObjectURL(fileBlobs[i]);
  }

  const gltfJson = JSON.parse(await zip.file("scene.gltf").async("text"));
  gltfJson.buffers && gltfJson.buffers.forEach(b => (b.uri = fileMap[b.uri]));
  gltfJson.images && gltfJson.images.forEach(i => (i.uri = fileMap[i.uri]));

  fileMap["scene.gtlf"] = URL.createObjectURL(new Blob([JSON.stringify(gltfJson, null, 2)], { type: "text/plain" }));

  return fileMap;
}

self.onmessage = async e => {
  try {
    const fileMap = await fetchZipAndGetBlobs(e.data);
    self.postMessage([true, fileMap]);
  } catch (e) {
    self.postMessage([false, e.message]);
  }
  delete self.onmessage;
};