const scripts = {};

const defaultOptions = {
  async: true,
  defer: true,
};

function getGlobalLib(name, url, options = defaultOptions) {
  if (scripts[name]) return scripts[name];

  if (window[name]) {
    scripts[name] = window[name];
    return scripts[name];
  }

  const mergedOptions = { ...defaultOptions, ...options };

  const promise = new Promise((resolve, reject) => {
    let script = document.createElement("script");
    script.async = mergedOptions.async;
    script.defer = mergedOptions.defer;

    function onloadHander(_, isAbort) {
      if (
        isAbort ||
        !script.readyState ||
        /loaded|complete/.test(script.readyState)
      ) {
        script.onload = null;
        script.onreadystatechange = null;

        if (isAbort) {
          reject();
        } else {
          scripts[name] = window[name];
          resolve(scripts[name]);
        }

        document.body.removeChild(script);
        script = undefined;
      }
    }

    // It's important that the script is appended before onload and src are set.
    document.body.appendChild(script);

    script.onload = script.onreadystatechange = onloadHander;
    script.src = url;
  });

  scripts[name] = promise;

  return scripts[name];
}

export default getGlobalLib;