'use strict';

/**

* Contains "command" code for "one-and-dones"--options passed
* to Mocha which cause it to just dump some info and exit.
* See {@link module:lib/cli/one-and-dones.ONE_AND_DONE_ARGS ONE_AND_DONE_ARGS} for more info.
* @module
* @private
*/

const align = require('wide-align'); const Mocha = require('../mocha');

/**

* Dumps a sorted list of the enumerable, lower-case keys of some object
* to `STDOUT`.
* @param {Object} obj - Object, ostensibly having some enumerable keys
* @ignore
* @private
*/

const showKeys = obj => {

console.log();
const keys = Object.keys(obj);
const maxKeyLength = keys.reduce((max, key) => Math.max(max, key.length), 0);
keys
  .filter(
    key => /^[a-z]/.test(key) && !obj[key].browserOnly && !obj[key].abstract
  )
  .sort()
  .forEach(key => {
    const description = obj[key].description;
    console.log(
      `    ${align.left(key, maxKeyLength + 1)}${
        description ? `- ${description}` : ''
      }`
    );
  });
console.log();

};

/**

* Handlers for one-and-done options
* @namespace
* @private
*/

exports.ONE_AND_DONES = {

/**
 * Dump list of built-in interfaces
 * @private
 */
interfaces: () => {
  showKeys(Mocha.interfaces);
},
/**
 * Dump list of built-in reporters
 * @private
 */
reporters: () => {
  showKeys(Mocha.reporters);
}

};

/**

* A Set of all one-and-done options
* @type Set<string>
* @private
*/

exports.ONE_AND_DONE_ARGS = new Set(

['help', 'h', 'version', 'V'].concat(Object.keys(exports.ONE_AND_DONES))

);