#!/usr/bin/env node
var argv = require('yargs')
      .usage('Usage: $0 [options] file...')

      .alias('v', 'version')
      .version(function() { return require('../package').version; })
      .describe('v', 'show version information')

      .help('h')
      .alias('h', 'help')
      .option('r', {
        alias : 'readme',
        describe: 'Provide a README markdown file',
        type: 'string',
        nargs: 1,
        default: null
      })
      .option('n', {
        alias : 'name',
        describe: 'The name of the project',
        type: 'string',
        nargs: 1,
        default: null
      })
      .option('o', {
        alias : 'output',
        describe: 'The output directory',
        type: 'string',
        nargs: 1,
        default: 'docs'
      })
      .option('owners', {
        describe: 'The owners of the project',
        type: 'string',
        nargs: 1,
        default: null
      })
      .option('project-version', {
        alias: 'p',
        describe: 'A version number. Use "package.json" to read from that file.',
        type: 'string',
        nargs: 1,
        default: null
      })
      .option('config', {
        alias: 'c',
        describe: 'A JSON configuration file',
        type: 'string',
        nargs: 1,
        default: null
      })

      .epilog('Copyright 2016')
      .argv;
var winston = require('winston');
var logger = new winston.Logger({
  level: 'info',
  transports: [
    new (winston.transports.Console)({
      colorize: true
    })
    
  ]
});

var process = require('process');
var fs = require('fs-extra');
var jsonfile = require('jsonfile');
var indoc = require('../lib/main');

////////////////////////////////////////////////

if(argv.config) {
  
  jsonfile.readFile(argv.config, function(err, data) {

    if(err) {
      logger.log('error', 'Could not read config file "' + argv.config + '"');
      return;
    }

    run(data);
    
  });
  
} else {

  if(argv._.length == 0) {
    logger.log('error', 'No files specified');
    process.exit(0);
  }
  
  run({
    files: argv._,
    readme: argv.r,
    name: argv.n,
    output: argv.o,
    owners: argv.owners,
    version: argv['project-version'],
  });
}

////////////////////////////////////////////////

function run(options) {

  function elapsed(start) {
    return ((Date.now() - start) * 0.001).toFixed(2) + 's';
  }

  var start = Date.now();
  var project = new indoc.Project(options);
  project.on('duplicate-file', function(data) {
    logger.log('warn', 'Duplicate file "' + data.filename + '"');
  });
  project.on('recursive-file', function(data) {
    logger.log('warn', 'File "' + data.filename + '" is in the output directory, ignoring');
  });
  project.on('project-link-err', function(data) {
    logger.log('warn', 'File "' + data.filename + '" links to nonexistent file "' + data.link + '"');
  });
  project.on('template-err', function(data) {
    logger.log('error', 'Could not read template "' + data.filename + '"');
    process.exit(1);
  });
  project.on('package-json-err', function(data) {
    logger.log('error', 'Could not get version number from "package.json"');
  });
  project.on('language-not-found', function(data) {
    logger.log('error', 'Could not detect the programming language of "' + data.filename + '"');
  });
  project.on('language-highlight-err', function(data) {
    logger.log('error', 'Could not highlight "' + data.filename + '" ("' + data.language + '" not known by highlight.js)');
  });
  project.on('readme-err', function(data) {
    logger.log('warn', 'Could not open README file "' + data.filename + '"');
  });
  project.on('copy-err', function(data) {
    logger.log('warn', 'Could not copy file "' + data.src + '" to "' + data.dest + '"');
  });
  project.on('run-file-complete', function(data) {
    
    if(data.err) {
      logger.log('error', 'Could not generate "' + data.data.filename + '"');
      return;
    }
    
    logger.log('info', 'Generated "' + data.data.filename + '"');
  });
  project.run(function(err, data) {

    var total = data.total;
    var errors = data.errors;
    var number = total;
    
    if(errors) number = (total - errors) + '/' + total;
    logger.log('info', 'Successfully generated ' + number + ' file' + (total == 1 ? '' : 's') + ' in ' + elapsed(start));

  });
  
}