var fs = require('fs');

var log = require('loglevel');
var sprintf = require('sprintf-js').sprintf;
var _ = require('underscore');

var chalk = require('./chalk');
var config = require('./config');
var icon = require('./icon');
var h = require('./helper');

// We are expecting a tier configuration like:
// global config < local config < cli params
// Color is a tricky one so we manually handle it here.
function setColor() {
  // FIXME: delete this hack when supports-color handles it well.
  if (process.env.TERM_PROGRAM === 'iTerm.app') chalk.use256 = true;

  chalk.enabled = config.USE_COLOR && chalk.enabled;
  chalk.init();
  chalk.setTheme(config.COLOR_THEME);
}

function setIcon() {
  icon.init();
  icon.setTheme(config.ICON_THEME);
}

function setLogLevel() {
  var level = log.levels.INFO;
  if (process.argv.indexOf('-v') >= 0) level = log.levels.DEBUG;
  if (process.argv.indexOf('-vv') >= 0) level = log.levels.TRACE;

  log.setLevel(level);

  log.fail = function(e) {
    log.error(chalk.red(sprintf('[ERROR] %s [%d]', (e.msg || e), (e.statusCode || 0))));
  };

  _.each(['debug', 'trace'], function(level) {
    log[level] = _.wrap(log[level], function(func) {
      var args = Array.prototype.slice.call(arguments);
      args[0] = '[' + level.toUpperCase() + ']';
      func.apply(null, _.map(args, function(arg) {
        return chalk.gray(arg);
      }));
    });
  });

  if (level === log.levels.TRACE) {
    var request = require('request');
    request.debug = true;
    // FIXME: hack request log, hope no one else use it...
    console.error = _.wrap(console.error, function(func) {
      var args = Array.prototype.slice.call(arguments);
      args.shift();
      if (args.length > 0 && args[0].indexOf('REQUEST ') === 0) {
        args.unshift('[TRACE]');
      }
      console.log.apply(null, _.map(args, function(arg) {
        return chalk.gray(h.printSafeHTTP(arg));
      }));
    });
  }
}

function checkCache() {
  var cacheDir = h.getCacheDir();

  if (!fs.existsSync(cacheDir))
    fs.mkdirSync(cacheDir);
}

var cli = {};

cli.run = function() {
  config.init();

  checkCache();
  setColor();
  setIcon();
  setLogLevel();

  process.stdout.on('error', function(e) {
    if (e.code === 'EPIPE') process.exit();
  });

  require('yargs')
    .commandDir('commands')
    .completion()
    .help()
    .strict()
    .argv;
};

module.exports = cli;