import { avatarInitials, cssVar } from '../../../util/common';

// renders the avatar and returns it as an URL
export default async function renderAvatar({
  text, bgColor, imageSrc, size, borderRadius, scale,
}) {
  try {
    const canvas = document.createElement('canvas');
    canvas.width = size * scale;
    canvas.height = size * scale;

    const ctx = canvas.getContext('2d');

    ctx.scale(scale, scale);

    // rounded corners
    ctx.beginPath();
    ctx.moveTo(size, size);
    ctx.arcTo(0, size, 0, 0, borderRadius);
    ctx.arcTo(0, 0, size, 0, borderRadius);
    ctx.arcTo(size, 0, size, size, borderRadius);
    ctx.arcTo(size, size, 0, size, borderRadius);

    if (imageSrc) {
      // clip corners of image
      ctx.closePath();
      ctx.clip();

      const img = new Image();
      img.crossOrigin = 'anonymous';
      const promise = new Promise((resolve, reject) => {
        img.onerror = reject;
        img.onload = resolve;
      });
      img.src = imageSrc;
      await promise;

      ctx.drawImage(img, 0, 0, size, size);
    } else {
      // colored background
      ctx.fillStyle = cssVar(bgColor);
      ctx.fill();

      // centered letter
      ctx.fillStyle = '#fff';
      ctx.font = `${cssVar('--fs-s1')} ${cssVar('--font-primary')}`;
      ctx.textBaseline = 'middle';
      ctx.textAlign = 'center';
      ctx.fillText(avatarInitials(text), size / 2, size / 2);
    }

    return canvas.toDataURL();
  } catch (e) {
    console.error(e);
    return imageSrc;
  }
}
