<!-- <script src="https://unpkg.com/@ffmpeg/ffmpeg@0.8.1/dist/ffmpeg.min.js"></script> -->
<script src="https://unpkg.com/@ffmpeg/ffmpeg@0.10.0/dist/ffmpeg.min.js"></script>

<canvas id="canvas" style="height: 900px; width: 900px"></canvas>

<video id="myVideo" controls="controls"></video>
<video id="output-video" controls="controls"></video>

<a id="dl" href="" download="download.mp4"></a>

<div id="message"></div>

<script>
  let c = document.getElementById("canvas");
  let ctx = c.getContext("2d");
  //   ctx.canvas.width = window.innerWidth;
  //   ctx.canvas.height = window.innerHeight;
  ctx.canvas.width = 900;
  ctx.canvas.height = 900;

  centerX = ctx.canvas.width / 2;
  centerY = ctx.canvas.height / 2;

  let deg_per_sec = 30 / 5000;
  let timeLimit = 10;
  let fps = 60;

  rotation = 0; //was = j = angle
  currentFrame = 0; //was = i

  const { createFFmpeg } = FFmpeg;
  const ffmpeg = createFFmpeg({
    log: true,
  });

  const transcode = async (webcamData) => {
    const message = document.getElementById("message");
    const name = "record.webm";
    await ffmpeg.load();
    message.innerHTML = "Start transcoding";
    await ffmpeg.write(name, webcamData);
    await ffmpeg.transcode(name, "output.mp4");
    message.innerHTML = "Complete transcoding";
    const data = ffmpeg.read("output.mp4");

    const video = document.getElementById("output-video");
    video.src = URL.createObjectURL(
      new Blob([data.buffer], { type: "video/mp4" })
    );
    dl.href = video.src;
    dl.innerHTML = "download mp4";
  };

  fn().then(async ({ url, blob }) => {
    transcode(new Uint8Array(await blob.arrayBuffer()));
  });

  function fn() {
    var recordedChunks = [];

    var time = 0;
    var canvas = document.getElementById("canvas");

    return new Promise(function (res, rej) {
      var stream = canvas.captureStream(60);

      mediaRecorder = new MediaRecorder(stream, {
        mimeType: "video/webm; codecs=vp9",
      });

      mediaRecorder.start(time);

      mediaRecorder.ondataavailable = function (e) {
        recordedChunks.push(event.data);
        // for demo, removed stop() call to capture more than one frame
      };

      mediaRecorder.onstop = function (event) {
        var blob = new Blob(recordedChunks, {
          type: "video/webm",
        });
        var url = URL.createObjectURL(blob);
        res({ url, blob }); // resolve both blob and url in an object

        myVideo.src = url;
        // removed data url conversion for brevity
      };
      
      // for demo, draw random lines and then stop recording
    //   var i = 0,
    //   tid = setInterval(() => {
    //       if (currentFrame > timeLimit / (1 / fps)) {
    //           // draw 20 lines
    //           clearInterval(tid);
    //           mediaRecorder.stop();
    //       }
    //       //   let canvas = document.querySelector("canvas");
    //       //   let cx = canvas.getContext("2d");
    //       //   cx.beginPath();
    //       //   cx.strokeStyle = "green";
    //       //   cx.moveTo(Math.random() * 600, Math.random() * 600);
    //       //   cx.lineTo(Math.random() * 600, Math.random() * 600);
    //       //   cx.stroke();

    //       render_clear();
    //       // Draw_Phyllotaxis(rotation + 3.1);
    //       Draw_Phyllotaxis(rotation + 1.5);

    //       rotation += deg_per_sec / fps; // was = j = angle, now = rotation
    //       currentFrame += 1; // was = i
    //     }, 1000 / fps);
    function render() {
        if (currentFrame < timeLimit / (1 / fps)) {
          setTimeout(() => {
            render();
            render_clear();

            // Draw_Phyllotaxis(rotation + 3.1);
            Draw_Phyllotaxis(rotation + 1.5);
            console.log(rotation + 3.1);
            // Draw_Phyllotaxis(rotation/5000);

            // Draw_center(); //Debugging
            // DrawBorder();
          }, 1000 / fps);
          rotation += deg_per_sec / fps; // was = j = angle, now = rotation
          currentFrame += 1; // was = i
        }
        else{
            mediaRecorder.stop();
        }
      }

      render();

    });
  }

  function Draw_Phyllotaxis(angle) {
    // colour1 = [255, 170, 0];
    // colour2 = [255, 0, 221];
    colour1 = [45, 129, 252];
    colour2 = [252, 3, 98];

    var c = 24; //something to do with width. but not width

    for (let n = 0; n < 300; n += 1) {
      ncolour = LerpRGB(colour1, colour2, Math.cos(rad(n / 2)));
      var a = n * angle; //137.5;
      var r = c * Math.sqrt(n);
      var x = r * Math.cos(a) + centerX;
      var y = r * Math.sin(a) + centerY;

      ctx.beginPath();
      ctx.arc(x, y, 8, 0, 2 * Math.PI);
      ctx.fillStyle = colourToText(ncolour);
      ctx.fill();
    }
  }
  function rad(degrees) {
    var pi = Math.PI;
    return degrees * (pi / 180);
  }

  function LerpRGB(a, b, t) {
    if (t < 0) {
      t *= -1;
    }
    var newColor = [0, 0, 0];
    newColor[0] = a[0] + (b[0] - a[0]) * t;
    newColor[1] = a[1] + (b[1] - a[1]) * t;
    newColor[2] = a[2] + (b[2] - a[2]) * t;
    return newColor;
  }

  function colourToText(colour) {
    return "rgb(" + colour[0] + "," + colour[1] + "," + colour[2] + ")";
  }

  function render_clear() {
    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
    ctx.fillStyle = "black";
    ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
  }
</script>