/**
 * 命令行相关的信息和工具类方法暴露在此模块中。
 * @namespace Hoo.cli
 */
module.exports = function (fis) {
  var cli = fis.cli;
  var path = require('path');
  var _ = require('./util.js');
  var util = require('util');
  var lolcat = require('fis-lolcat');

  /**
   * 显示帮助信息，主要用来格式化信息，处理缩进等。fis command 插件，可以用此方法来输出帮助信息。
   *
   * @param  {String} [cmdName]  命令名称
   * @param  {Object} [options]  配置
   * @param  {Array} [commands] 支持的命令集合
   * @memberOf fis.cli
   * @name help
   * @function
   */
  cli.help = function (cmdName, options, commands) {
    var strs = [
      // '',
      // ' Usage: ' + cli.name + ' ' + (cmdName ? cmdName : '<command>')
    ];

    if (!cmdName) {
      commands = {};
      fis.media().get('modules.commands', []).forEach(function (name) {
        var cmd = fis.require('command', name);
        name = cmd.name || name;
        name = fis.util.pad(name, 12);
        commands[name] = cmd.desc || '';
      });

      options = {
        'hoo -h': '打印HOO帮助信息，显示当前信息',
        'hoo -v': '打印HOO当前版本号',
        'hoo init <path>': '初始化一个项目，会提示您选择模板，输入开发专题活动（官网）所需要的一些必要信息，hoo自动初始化该项目',
        'hoo dev <path>': '活动专题--进入开发模式，会监听源码修改自动同步至浏览器',
        'hoo prod <path>': '活动专题--将产出的上线代码自动发布到135测试环境',
        'hoo deploy <path>': '活动专题--自动发布上线代码到本地dist目录下，并提交至svn库',
        'hoo pngc <path>': '活动专题--压缩所有png图片',
        'hoo wDev <gamekey>': '游戏官网--开发官网静态UI',
        'hoo wProd <gamekey>': '游戏官网--编译构建代码到本地代码库（可供发布的代码）',
        'hoo wpngc <gamekey>': '游戏官网--压缩所有png图片',
      };
      /*添加SQ工程化的命令说明*/
      var sqcmd = require( '../sqp/config/hoo.cmd' ).cmdInfo;
      for ( var ii in sqcmd ) {
        options[ ii ] = sqcmd[ ii ];
      }
    }

    options = options || {};
    commands = commands || {};
    var optionsKeys = Object.keys(options);
    // var commandsKeys = Object.keys(commands);
    var maxWidth;

    /*if (commandsKeys.length) {
     maxWidth = commandsKeys.reduce(function (prev, curr) {
     return curr.length > prev ? curr.length : prev;
     }, 0) + 4;

     strs.push(null, ' Commands:', null);

     commandsKeys.forEach(function (key) {
     strs.push(util.format('   %s %s', _.pad(key, maxWidth), commands[key]));
     });
     }*/

    if (optionsKeys.length) {
      maxWidth = optionsKeys.reduce(function (prev, curr) {
          return curr.length > prev ? curr.length : prev;
        }, 0) + 4;

      strs.push(null, ' 帮助信息:', null);

      optionsKeys.forEach(function (key) {
        strs.push(util.format('   %s %s', _.pad(key, maxWidth), options[key]));
      });

      strs.push(null);
    }

    console.log(strs.join('\n'));
  };

  /**
   * 输出 HOO 版本信息。
   *
   * ```
   * v1.0.0
   * HHHHHHHHH     HHHHHHHHH     OOOOOOOOO          OOOOOOOOO
   * H:::::::H     H:::::::H   OO:::::::::OO      OO:::::::::OO
   * H:::::::H     H:::::::H OO:::::::::::::OO  OO:::::::::::::OO
   * HH::::::H     H::::::HHO:::::::OOO:::::::OO:::::::OOO:::::::O
   *   H:::::H     H:::::H  O::::::O   O::::::OO::::::O   O::::::O
   *   H:::::H     H:::::H  O:::::O     O:::::OO:::::O     O:::::O
   *   H::::::HHHHH::::::H  O:::::O     O:::::OO:::::O     O:::::O
   *   H:::::::::::::::::H  O:::::O     O:::::OO:::::O     O:::::O
   *   H:::::::::::::::::H  O:::::O     O:::::OO:::::O     O:::::O
   *   H::::::HHHHH::::::H  O:::::O     O:::::OO:::::O     O:::::O
   *   H:::::H     H:::::H  O:::::O     O:::::OO:::::O     O:::::O
   *   H:::::H     H:::::H  O::::::O   O::::::OO::::::O   O::::::O
   * HH::::::H     H::::::HHO:::::::OOO:::::::OO:::::::OOO:::::::O
   * H:::::::H     H:::::::H OO:::::::::::::OO  OO:::::::::::::OO
   * H:::::::H     H:::::::H   OO:::::::::OO      OO:::::::::OO
   * HHHHHHHHH     HHHHHHHHH     OOOOOOOOO          OOOOOOOOO
   *
   * @memberOf HOO.cli
   * @name version
   * @function
   */
  cli.version = function () {
    var content = ['',
      '  v' + cli.info.version,
      ''
    ].join('\n');

    var logo;

    if (fis.util.isWin()) {
      logo = [
        '',
        'HHHHHHHHH     HHHHHHHHH'.bold.blue + '     OOOOOOOOO          OOOOOOOOO'.bold.yellow,
        'H:::::::H     H:::::::H'.bold.blue + '   OO:::::::::OO      OO:::::::::OO'.bold.yellow,
        'H:::::::H     H:::::::H'.bold.blue + ' OO:::::::::::::OO  OO:::::::::::::OO'.bold.yellow,
        'HH::::::H     H::::::HH'.bold.blue + 'O:::::::OOO:::::::OO:::::::OOO:::::::O'.bold.yellow,
        '  H:::::H     H:::::H'.bold.blue + '  O::::::O   O::::::OO::::::O   O::::::O'.bold.yellow,
        '  H:::::H     H:::::H'.bold.blue + '  O:::::O     O:::::OO:::::O     O:::::O'.bold.yellow,
        '  H::::::HHHHH::::::H'.bold.blue + '  O:::::O     O:::::OO:::::O     O:::::O'.bold.yellow,
        '  H:::::::::::::::::H'.bold.blue + '  O:::::O     O:::::OO:::::O     O:::::O'.bold.yellow,
        '  H:::::::::::::::::H'.bold.blue + '  O:::::O     O:::::OO:::::O     O:::::O'.bold.yellow,
        '  H::::::HHHHH::::::H'.bold.blue + '  O:::::O     O:::::OO:::::O     O:::::O'.bold.yellow,
        '  H:::::H     H:::::H'.bold.blue + '  O:::::O     O:::::OO:::::O     O:::::O'.bold.yellow,
        '  H:::::H     H:::::H'.bold.blue + '  O::::::O   O::::::OO::::::O   O::::::O'.bold.yellow,
        'HH::::::H     H::::::HH'.bold.blue + 'O:::::::OOO:::::::OO:::::::OOO:::::::O'.bold.yellow,
        'H:::::::H     H:::::::H'.bold.blue + ' OO:::::::::::::OO  OO:::::::::::::OO'.bold.yellow,
        'H:::::::H     H:::::::H'.bold.blue + '   OO:::::::::OO      OO:::::::::OO'.bold.yellow,
        'HHHHHHHHH     HHHHHHHHH'.bold.blue + '     OOOOOOOOO          OOOOOOOOO'.bold.yellow,
        '',
        ''
      ].join('\n');
    } else {
      logo = [
        '',
        'HHHHHHHHH     HHHHHHHHH     OOOOOOOOO          OOOOOOOOO',
        'H:::::::H     H:::::::H   OO:::::::::OO      OO:::::::::OO',
        'H:::::::H     H:::::::H OO:::::::::::::OO  OO:::::::::::::OO',
        'HH::::::H     H::::::HHO:::::::OOO:::::::OO:::::::OOO:::::::O',
        '  H:::::H     H:::::H  O::::::O   O::::::OO::::::O   O::::::O',
        '  H:::::H     H:::::H  O:::::O     O:::::OO:::::O     O:::::O',
        '  H::::::HHHHH::::::H  O:::::O     O:::::OO:::::O     O:::::O',
        '  H:::::::::::::::::H  O:::::O     O:::::OO:::::O     O:::::O',
        '  H:::::::::::::::::H  O:::::O     O:::::OO:::::O     O:::::O',
        '  H::::::HHHHH::::::H  O:::::O     O:::::OO:::::O     O:::::O',
        '  H:::::H     H:::::H  O:::::O     O:::::OO:::::O     O:::::O',
        '  H:::::H     H:::::H  O::::::O   O::::::OO::::::O   O::::::O',
        'HH::::::H     H::::::HHO:::::::OOO:::::::OO:::::::OOO:::::::O',
        'H:::::::H     H:::::::H OO:::::::::::::OO  OO:::::::::::::OO',
        'H:::::::H     H:::::::H   OO:::::::::OO      OO:::::::::OO',
        'HHHHHHHHH     HHHHHHHHH     OOOOOOOOO          OOOOOOOOO',
        '',
        ''
      ].join('\n');
    }

    if (fis.get('options.color') !== false) {
      logo = lolcat(logo);
    }
    console.log(content + '\n' + logo);
  };
};

