function isOpera(userAgent) {
  return userAgent.indexOf('Opera') >= 0 || userAgent.indexOf('OPR') >= 0;
}

function getOperaVersion(userAgent) {
  const match = userAgent.match(/OPR[^0-9]*([0-9]+)[^0-9]+/);
  return match ? parseInt(match[1], 10) : false;
}

function isChrome(userAgent) {
  return userAgent.indexOf('Chrom') >= 0 && !isOpera(userAgent);
}

function getChromeVersion(userAgent) {
  const match = userAgent.match(/Chrom(?:e|ium)\/([0-9]+)\./);
  return match ? parseInt(match[1], 10) : false;
}

export function canInjectU2fApi(userAgent) {
  const isSupportedChrome = isChrome(userAgent) && getChromeVersion(userAgent) >= 41;
  const isSupportedOpera = isOpera(userAgent) && getOperaVersion(userAgent) >= 40;
  const isMobile = (
    userAgent.indexOf('droid') >= 0 ||
    userAgent.indexOf('CriOS') >= 0 ||
    /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent)
  );
  return (isSupportedChrome || isSupportedOpera) && !isMobile;
}

export default function importU2FLibrary() {
  if (window.u2f) {
    return Promise.resolve(window.u2f);
  }

  const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : '';
  if (canInjectU2fApi(userAgent) || (gon && gon.test_env)) {
    return import(/* webpackMode: "eager" */ 'vendor/u2f').then(() => window.u2f);
  }

  return Promise.reject();
}