(function() {
  var async, build, chalk, commonOptions, commonUsage, extendOptions, fileExistsSync, fs, loadEnv, logger, options, path, ref, rimraf, usage;

  async = require('async');

  chalk = require('chalk');

  fs = require('fs');

  path = require('path');

  rimraf = require('rimraf');

  fileExistsSync = require('./../core/utils').fileExistsSync;

  ref = require('./common'), loadEnv = ref.loadEnv, commonOptions = ref.commonOptions, commonUsage = ref.commonUsage, extendOptions = ref.extendOptions;

  logger = require('./../core/logger').logger;

  usage = "\nusage: wintersmith build [options]\n\noptions:\n\n  -o, --output [path]           directory to write build-output (defaults to ./build)\n  -X, --clean                   clean before building (warning: will recursively delete everything at output path)\n  " + commonUsage + "\n\n  all options can also be set in the config file\n\nexamples:\n\n  build using a config file (assuming config.json is found in working directory):\n  $ wintersmith build\n\n  build using command line options:\n  $ wintersmith build -o /var/www/public/ -T extra_data.json -C ~/my-blog\n\n  or using both (command-line options will override config options):\n  $ wintersmith build --config another_config.json --clean\n";

  options = {
    alias: {
      output: 'o',
      clean: 'X'
    },
    boolean: ['clean'],
    string: ['output']
  };

  extendOptions(options, commonOptions);

  build = function(argv) {
    var prepareOutputDir, start;
    start = new Date();
    logger.info('building site');
    prepareOutputDir = function(env, callback) {
      var exists, outputDir;
      outputDir = env.resolvePath(env.config.output);
      exists = fileExistsSync(outputDir);
      if (exists) {
        if (argv.clean) {
          logger.verbose("cleaning - running rimraf on " + outputDir);
          return async.series([
            function(callback) {
              return rimraf(outputDir, callback);
            }, function(callback) {
              return fs.mkdir(outputDir, callback);
            }
          ], callback);
        } else {
          return callback();
        }
      } else {
        logger.verbose("creating output directory " + outputDir);
        return fs.mkdir(outputDir, callback);
      }
    };
    return async.waterfall([
      function(callback) {
        return loadEnv(argv, callback);
      }, function(env, callback) {
        return prepareOutputDir(env, function(error) {
          return callback(error, env);
        });
      }, function(env, callback) {
        return env.build(callback);
      }
    ], function(error) {
      var delta, stop;
      if (error) {
        logger.error(error.message, error);
        return process.exit(1);
      } else {
        stop = new Date();
        delta = stop - start;
        logger.info("done in " + (chalk.bold(delta)) + " ms\n");
        return process.exit();
      }
    });
  };

  module.exports = build;

  module.exports.usage = usage;

  module.exports.options = options;

}).call(this);