import * as Tone from 'tone';

export const hideHeader = () => {
  document.getElementById('header').style = 'display:none';
};

function frame(callback) {
  if (window.strudelAnimation) {
    cancelAnimationFrame(window.strudelAnimation);
  }
  const animate = (animationTime) => {
    const toneTime = Tone.getTransport().seconds;
    callback(animationTime, toneTime);
    window.strudelAnimation = requestAnimationFrame(animate);
  };
  requestAnimationFrame(animate);
}

export const backgroundImage = function (src, animateOptions = {}) {
  const container = document.getElementById('code');
  const bg = 'background-image:url(' + src + ');background-size:contain;';
  container.style = bg;
  const { className: initialClassName } = container;
  const handleOption = (option, value) => {
    ({
      style: () => (container.style = bg + ';' + value),
      className: () => (container.className = value + ' ' + initialClassName),
    }[option]());
  };
  const funcOptions = Object.entries(animateOptions).filter(([_, v]) => typeof v === 'function');
  const stringOptions = Object.entries(animateOptions).filter(([_, v]) => typeof v === 'string');
  stringOptions.forEach(([option, value]) => handleOption(option, value));

  if (funcOptions.length === 0) {
    return;
  }
  frame((_, t) =>
    funcOptions.forEach(([option, value]) => {
      handleOption(option, value(t));
    })
  );
};
