text: const fs = require('fs-extra');
  const { fileExtension, basename, dirname } = require('lib/path-utils.js');
  const wrap_ = require('word-wrap');
  const { _, setLocale, languageCode } = require('lib/locale.js');
  
  const rootDir = dirname(dirname(__dirname));
  const MAX_WIDTH = 78;
  const INDENT = '    ';
  
  function wrap(text, indent) {
  	return wrap_(text, {
  		width: MAX_WIDTH - indent.length,
  		indent: indent,
  	});
  }
  
  function renderOptions(options) {
  	let output = [];
  	const optionColWidth = getOptionColWidth(options);
  
  	for (let i = 0; i < options.length; i++) {
  		let option = options[i];
  		const flag = option[0];
  		const indent = INDENT + INDENT + ' '.repeat(optionColWidth + 2);
  		
  		let r = wrap(option[1], indent);
  		r = r.substr(flag.length + (INDENT + INDENT).length);
  		r = INDENT + INDENT + flag + r;
  		output.push(r);
  	}
  
  	return output.join("\n");
  }
  
  function renderCommand(cmd) {
  	let output = [];
  	output.push(INDENT + cmd.usage());
  	output.push('');
  	output.push(wrap(cmd.description(), INDENT + INDENT));
  
  	const optionString = renderOptions(cmd.options());
  
  	if (optionString) {
  		output.push('');
  		output.push(optionString);
  	}
  	return output.join("\n");
  }
  
  function getCommands() {
  	let output = [];
  	fs.readdirSync(__dirname).forEach((path) => {
  		if (path.indexOf('command-') !== 0) return;
  		const ext = fileExtension(path)
  		if (ext != 'js') return;
  
  		let CommandClass = require('./' + path);
  		let cmd = new CommandClass();
  		if (!cmd.enabled()) return;
  		if (cmd.hidden()) return;
  		output.push(cmd);
  	});
  	return output;
  }
  
  function getOptionColWidth(options) {
  	let output = 0;
  	for (let j = 0; j < options.length; j++) {
  		const option = options[j];
  		if (option[0].length > output) output = option[0].length;
  	}
  	return output;
  }
  
  function getHeader() {
  	let output = [];
  
  	output.push('NAME');
  	output.push('');
  	output.push(wrap('joplin - a note taking and to-do app with synchronisation capabilities'), INDENT);
  
  	output.push('');
  
  	output.push('DESCRIPTION');
  	output.push('');
  
  	let description = [];
  	description.push('Joplin is a note taking and to-do application, which can handle a large number of notes organised into notebooks.');
  	description.push('The notes are searchable, can be copied, tagged and modified with your own text editor.');
  	description.push("\n\n");
  	description.push('The notes can be synchronised with various target including the file system (for example with a network directory) or with Microsoft OneDrive.');
  	description.push("\n\n");
  	description.push('Notes exported from Evenotes via .enex files can be imported into Joplin, including the formatted content, resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.).');
  
  	output.push(wrap(description.join(''), INDENT));
  
  	return output.join("\n");
  }
  
  function getFooter() {
  	let output = [];
  
  	output.push('WEBSITE');
  	output.push('');
  	output.push(INDENT + 'https://joplin.cozic.net');
  
  	output.push('');
  
  	output.push('LICENSE');
  	output.push('');
  	let filePath = rootDir + '/LICENSE_' + languageCode();
  	if (!fs.existsSync(filePath)) filePath = rootDir + '/LICENSE';
  	const licenseText = fs.readFileSync(filePath, 'utf8');
  	output.push(wrap(licenseText, INDENT));
  
  	return output.join("\n");
  }
  
  async function main() {
  	// setLocale('fr_FR');
  
  	const commands = getCommands();
  	let commandBlocks = [];
  
  	for (let i = 0; i < commands.length; i++) {
  		let cmd = commands[i];
  		commandBlocks.push(renderCommand(cmd));
  	}
  
  	const headerText = getHeader();
  	const commandsText = commandBlocks.join("\n\n");
  	const footerText = getFooter();
  
  	console.info(headerText + "\n\n" + 'USAGE' + "\n\n" + commandsText + "\n\n" + footerText);
  }
  
  main().catch((error) => {
  	console.error(error);
  });