import fs from 'fs';
import { existsFileSync } from '../util/exists';
import parseArgv from './parseArgv';

const defaultConfig = 'mocha-webpack.opts';

function handleMissingConfig(config) {
  if (config) {
    throw new Error(`Options file '${config}' not found`);
  }

  return {};
}

const createStripSurroundingChar = (c) => (s) => {
  if (s.indexOf(c) === 0 && s.lastIndexOf(c) === s.length - 1 && s.indexOf(c) !== s.lastIndexOf(c)) {
    return s.substring(1, s.length - 1);
  }
  return s;
};

const stripSingleQuotes = createStripSurroundingChar("'");
const stripDoubleQuotes = createStripSurroundingChar('"');

const removeSurroundingQuotes = (str) => {
  const stripped = stripDoubleQuotes(str);

  if (stripped !== str) {
    // strip only once
    return stripped;
  }
  return stripSingleQuotes(str);
};

export default function parseConfig(explicitConfig) {
  const config = explicitConfig || defaultConfig;

  if (!existsFileSync(config)) {
    return handleMissingConfig(explicitConfig);
  }

  const argv = fs.readFileSync(config, 'utf8')
    .replace(/\\\s/g, '%20')
    .split(/\s/)
    .filter(Boolean)
    .map((value) => value.replace(/%20/g, ' '))
    .map(removeSurroundingQuotes);
  const defaultOptions = parseArgv(argv, true);
  return defaultOptions;
}