<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>SkottieKit Demo</title>

  <script type="text/javascript" src="/bin/skottiekit.js"></script>

  <script type="text/javascript" charset="utf-8">
    const bootTime = performance.now();
    const cdn = 'https://storage.googleapis.com/skia-cdn/misc/';
    // loadKit resolves with SkottieKit.
    const loadKit = SkottieKitInit({
      locateFile: (file) => '/bin/'+file,
    });

    loadKit.then(() => {
      const n = performance.now();
      console.log(`loaded Kit in ${(n - bootTime).toFixed(2)} ms`)
    });

    const loadLegoJSON = fetch(cdn + 'lego_loader.json').then((resp) => {
      return resp.text();
    });
    const loadPartyJSON = fetch(cdn + 'confetti.json').then((resp) => {
      return resp.text();
    });
    const loadDrinksJSON = fetch(cdn + 'drinks.json').then((resp) => {
      return resp.text();
    });
    const loadOnboardingJSON = fetch(cdn + 'onboarding.json').then((resp) => {
      return resp.text();
    });



    function SkottieDemo(values, canvasID, width=400, height=400) {
      const [SkottieKit, legoJSON] = values;
      const animation = SkottieKit.MakeManagedAnimation(legoJSON);
      const duration = animation.duration() * 1000;
      const size = animation.size();

      const bounds = {fLeft: 0, fTop: 0, fRight: width, fBottom: height};

      const surface = SkottieKit.MakeCanvasSurface(canvasID);
      if (!surface) {
        console.error('Could not make surface');
        return;
      }

      const firstFrame = Date.now();
      const clearColor = SkottieKit.WHITE;

      function drawFrame(canvas) {
        const seek = ((Date.now() - firstFrame) / duration) % 1.0;
        const damage = animation.seek(seek);

        if (damage.fRight > damage.fLeft && damage.fBottom > damage.fTop) {
          canvas.clear(clearColor);
          animation.render(canvas, bounds);
        }
        surface.requestAnimationFrame(drawFrame);
      }
      surface.requestAnimationFrame(drawFrame);
    }

    const legosAnimating = Promise.all([loadKit, loadLegoJSON]).then((values) => {
      SkottieDemo(values, 'legos', 400, 400);
    });
    const partyAnimating = Promise.all([loadKit, loadPartyJSON]).then((values) => {
      SkottieDemo(values, 'party', 400, 400);
    });
    const drinksAnimating = Promise.all([loadKit, loadDrinksJSON]).then((values) => {
      SkottieDemo(values, 'drinks', 400, 400);
    });
    const onboardingAnimating = Promise.all([loadKit, loadOnboardingJSON]).then((values) => {
      SkottieDemo(values, 'onboarding', 400, 400);
    });

    Promise.all([legosAnimating, partyAnimating, drinksAnimating, onboardingAnimating]).then(() => {
      const frames = new Float64Array(100);
      let idx = 0;
      let now = performance.now();
      function benchFrame() {
        frames[idx] = performance.now() - now;
        idx++;
        if (idx < frames.length) {
          now = performance.now();
          window.requestAnimationFrame(benchFrame);
        } else {
          let out = '';
          for (const frameTime of frames) {
            out += frameTime.toFixed(2);
            out += '\n';
          }
          console.log(out);
        }
      }
      window.requestAnimationFrame(benchFrame);
    })
  </script>

  <style>
    canvas {
      border: 1px dashed #AAA;
      width: 400px;
      height: 400px;
    }
  </style>

</head>
<body>
  <h1> SkottieKit</h1>

  <canvas id=legos width=400 height=400></canvas>
  <canvas id=party width=400 height=400></canvas>
  <canvas id=drinks width=400 height=400></canvas>
  <canvas id=onboarding width=400 height=400></canvas>

</body>
</html>