import fs from 'fs';
import path from 'path';
import helpers from './helpers';

const { isOSX, isWindows, isLinux } = helpers;
const log = require('loglevel');
/**
 * Synchronously find a file or directory
 * @param {RegExp} pattern regex
 * @param {string} base path
 * @param {boolean} [findDir] if true, search results will be limited to only directories
 * @returns {Array}
 */
function findSync(pattern, basePath, findDir) {
  const matches = [];

  (function findSyncRecurse(base) {
    let children;
    try {
      children = fs.readdirSync(base);
    } catch (exception) {
      if (exception.code === 'ENOENT') {
        return;
      }
      throw exception;
    }

    children.forEach((child) => {
      const childPath = path.join(base, child);
      const childIsDirectory = fs.lstatSync(childPath).isDirectory();
      const patternMatches = pattern.test(childPath);

      if (!patternMatches) {
        if (!childIsDirectory) {
          return;
        }
        findSyncRecurse(childPath);
        return;
      }

      if (!findDir) {
        matches.push(childPath);
        return;
      }

      if (childIsDirectory) {
        matches.push(childPath);
      }
    });
  })(basePath);
  return matches;
}

function linuxMatch() {
  return findSync(/libpepflashplayer\.so/, '/opt/google/chrome')[0];
}

function windowsMatch() {
  return findSync(
    /pepflashplayer\.dll/,
    'C:\\Program Files (x86)\\Google\\Chrome',
  )[0];
}

function darwinMatch() {
  return findSync(
    /PepperFlashPlayer.plugin/,
    '/Applications/Google Chrome.app/',
    true,
  )[0];
}

function inferFlash() {
  if (isOSX()) {
    return darwinMatch();
  }

  if (isWindows()) {
    return windowsMatch();
  }

  if (isLinux()) {
    return linuxMatch();
  }

  log.warn('Unable to determine OS to infer flash player');
  return null;
}
export default inferFlash;
