import { ThumbImageBuffer } from 'agora-electron-sdk';

export default (input: any) => {
  const keyStr =
    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  let output = '';
  let chr1, chr2, chr3, enc1, enc2, enc3, enc4;
  let i = 0;

  while (i < input.length) {
    chr1 = input[i++];
    chr2 = i < input.length ? input[i++] : Number.NaN; // Not sure if the index
    chr3 = i < input.length ? input[i++] : Number.NaN; // checks are needed here

    enc1 = chr1 >> 2;
    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
    enc4 = chr3 & 63;

    if (isNaN(chr2)) {
      enc3 = enc4 = 64;
    } else if (isNaN(chr3)) {
      enc4 = 64;
    }
    output +=
      keyStr.charAt(enc1) +
      keyStr.charAt(enc2) +
      keyStr.charAt(enc3) +
      keyStr.charAt(enc4);
  }
  return output;
};

export const thumbImageBufferToBase64 = (target?: ThumbImageBuffer) => {
  if (!target) {
    return '';
  }

  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  if (!ctx) return '';

  const width = (canvas.width = target.width!);
  const height = (canvas.height = target.height!);

  const rowBytes = width * 4;
  for (let row = 0; row < height; row++) {
    const srow = row;
    const imageData = ctx.createImageData(width, 1);
    const start = srow * width * 4;
    for (let i = 0; i < rowBytes; i += 4) {
      imageData.data[i] = target.buffer![start + i + 2]!;
      imageData.data[i + 1] = target.buffer![start + i + 1]!;
      imageData.data[i + 2] = target.buffer![start + i]!;
      imageData.data[i + 3] = target.buffer![start + i + 3]!;
    }
    // if (process.platform === 'win32') {
    //   for (let i = 0; i < rowBytes; i += 4) {
    //     imageData.data[i] = target.buffer![start + i + 2]!;
    //     imageData.data[i + 1] = target.buffer![start + i + 1]!;
    //     imageData.data[i + 2] = target.buffer![start + i]!;
    //     imageData.data[i + 3] = target.buffer![start + i + 3]!;
    //   }
    // } else {
    //   for (let i = 0; i < rowBytes; ++i) {
    //     imageData.data[i] = target.buffer![start + i]!;
    //   }
    // }
    ctx.putImageData(imageData, 0, row);
  }

  return canvas.toDataURL('image/png');
};
