const isURL = require('is-url');

const defaultOptions = {
  // workerPath: 'https://cdn.jsdelivr.net/gh/naptha/tesseract.js@0.2.0/dist/worker.js',
  corePath: 'https://cdn.jsdelivr.net/gh/naptha/tesseract.js-core@0.1.0/index.js',
  langPath: 'https://cdn.jsdelivr.net/gh/naptha/tessdata@gh-pages/3.02/',
};

if (process.env.NODE_ENV === 'development') {
  console.debug('Using Development Configuration');
  // eslint-disable-next-line
  const { protocol, host } = location;
  defaultOptions.workerPath = `${protocol}://${host}/dist/worker.dev.js?nocache=${Math.random().toString(36).slice(3)}`;
} else {
  const { version } = require('../../package.json');
  defaultOptions.workerPath = `https://cdn.jsdelivr.net/gh/naptha/tesseract.js@${version}/dist/worker.js`;
}

const loadImage = (imageURI) => {
  if (isURL(imageURI)) {
    return fetch(imageURI)
      .then(resp => resp.buffer());
  }
  return new Promise();
};

exports.defaultOptions = defaultOptions;

exports.spawnWorker = (instance, workerOptions) => {
  let worker;
  if (window.Blob && window.URL) {
    const blob = new Blob([`importScripts("${workerOptions.workerPath}");`]);
    worker = new Worker(window.URL.createObjectURL(blob));
  } else {
    worker = new Worker(workerOptions.workerPath);
  }

  worker.onmessage = ({ data }) => {
    instance._recv(data);
  };

  return worker;
};

exports.terminateWorker = (instance) => {
  instance.worker.terminate();
};

exports.sendPacket = (instance, packet) => {
  loadImage(packet.payload.image)
    .then(buf => new Uint8Array(buf))
    .then((img) => {
      instance.worker.postMessage({
        ...packet,
        payload: {
          ...packet.payload,
          image: Array.from(img),
        },
      });
    });
};