/* eslint global-require: 0 */

const { CLIEngine } = require('eslint');

if (CLIEngine) {
  /* eslint no-inner-declarations: 0 */
  const assign = require('object.assign');
  const entries = require('object.entries');

  const baseConfig = require('.');

  const severities = ['off', 'warn', 'error'];

  function getSeverity(ruleConfig) {
    if (Array.isArray(ruleConfig)) {
      return getSeverity(ruleConfig[0]);
    }
    if (typeof ruleConfig === 'number') {
      return severities[ruleConfig];
    }
    return ruleConfig;
  }

  function onlyErrorOnRules(rulesToError, config) {
    const errorsOnly = assign({}, config);
    const cli = new CLIEngine({ baseConfig: config, useEslintrc: false });
    const baseRules = cli.getConfigForFile(require.resolve('./')).rules;

    entries(baseRules).forEach((rule) => {
      const ruleName = rule[0];
      const ruleConfig = rule[1];
      const severity = getSeverity(ruleConfig);

      if (rulesToError.indexOf(ruleName) === -1 && severity === 'error') {
        if (Array.isArray(ruleConfig)) {
          errorsOnly.rules[ruleName] = ['warn'].concat(ruleConfig.slice(1));
        } else if (typeof ruleConfig === 'number') {
          errorsOnly.rules[ruleName] = 1;
        } else {
          errorsOnly.rules[ruleName] = 'warn';
        }
      }
    });

    return errorsOnly;
  }

  module.exports = onlyErrorOnRules([
    'array-bracket-newline',
    'array-bracket-spacing',
    'array-element-newline',
    'arrow-spacing',
    'block-spacing',
    'comma-spacing',
    'computed-property-spacing',
    'dot-location',
    'eol-last',
    'func-call-spacing',
    'function-paren-newline',
    'generator-star-spacing',
    'implicit-arrow-linebreak',
    'indent',
    'key-spacing',
    'keyword-spacing',
    'line-comment-position',
    'linebreak-style',
    'multiline-ternary',
    'newline-per-chained-call',
    'no-irregular-whitespace',
    'no-mixed-spaces-and-tabs',
    'no-multi-spaces',
    'no-regex-spaces',
    'no-spaced-func',
    'no-trailing-spaces',
    'no-whitespace-before-property',
    'nonblock-statement-body-position',
    'object-curly-newline',
    'object-curly-spacing',
    'object-property-newline',
    'one-var-declaration-per-line',
    'operator-linebreak',
    'padded-blocks',
    'padding-line-between-statements',
    'rest-spread-spacing',
    'semi-spacing',
    'semi-style',
    'space-before-blocks',
    'space-before-function-paren',
    'space-in-parens',
    'space-infix-ops',
    'space-unary-ops',
    'spaced-comment',
    'switch-colon-spacing',
    'template-tag-spacing',
    'import/newline-after-import',
  ], baseConfig);
} else {
  const path = require('path');
  const { execSync } = require('child_process');

  module.exports = JSON.parse(String(execSync(path.join(__dirname, 'whitespace-async.js'))));
}
