#!/usr/bin/env node

var util = require('util');
var fs = require('fs');
var path = require('path');
var CleanCSS = require('../index');

var commands = require('commander');

var packageConfig = fs.readFileSync(path.join(path.dirname(fs.realpathSync(process.argv[1])), '../package.json'));
var buildVersion = JSON.parse(packageConfig).version;

var isWindows = process.platform == 'win32';

// Specify commander options to parse command line params correctly
commands
  .version(buildVersion, '-v, --version')
  .usage('[options] <source-file>')
  .option('-e, --remove-empty', 'Remove empty declarations (e.g. a{})')
  .option('-b, --keep-line-breaks', 'Keep line breaks')
  .option('--s0', 'Remove all special comments (i.e. /*! special comment */)')
  .option('--s1', 'Remove all special comments but the first one')
  .option('-r, --root [root-path]', 'Set a root path to which resolve absolute @import rules')
  .option('-o, --output [output-file]', 'Use [output-file] as output instead of stdout')
  .option('-s, --skip-import', 'Disable the @import processing');

commands.on('--help', function() {
  util.puts('  Examples:\n');
  util.puts('    %> cleancss one.css');
  util.puts('    %> cleancss -o one-min.css one.css');
  if (isWindows) {
    util.puts('    %> type one.css two.css three.css | cleancss -o merged-and-minified.css');
  } else {
    util.puts('    %> cat one.css two.css three.css | cleancss -o merged-and-minified.css');
    util.puts('    %> cat one.css two.css three.css | cleancss | gzip -9 -c > merged-minified-and-gzipped.css.gz');
  }
  util.puts('');
  process.exit();
});

commands.parse(process.argv);

var options = {
  source: null,
  target: null
};
var cleanOptions = {};
var fromStdin = !process.env['__DIRECT__'] && !process.stdin.isTTY;

// If no sensible data passed in just print help and exit
if (!fromStdin && commands.args.length == 0) {
  commands.outputHelp();
  return 0;
}

// Now coerce commands into CleanCSS configuration...
if (commands.output)
  options.target = commands.output;
if (commands.removeEmpty)
  cleanOptions.removeEmpty = true;
if (commands.keepLineBreaks)
  cleanOptions.keepBreaks = true;
if (commands.s1)
  cleanOptions.keepSpecialComments = 1;
if (commands.s0)
  cleanOptions.keepSpecialComments = 0;
if (commands.root)
  cleanOptions.root = commands.root;
if (commands.skipImport)
  cleanOptions.processImport = false;
if (commands.args.length > 0) {
  var source = commands.args[0];
  options.source = source;
  cleanOptions.relativeTo = path.dirname(path.resolve(source));
}

// ... and do the magic!
if (options.source) {
  fs.readFile(options.source, 'utf8', function(error, text) {
    if (error)
      throw error;
    output(CleanCSS.process(text, cleanOptions));
  });
} else {
  var stdin = process.openStdin();
  stdin.setEncoding('utf-8');
  var text = '';
  stdin.on('data', function(chunk) {
    text += chunk;
  });
  stdin.on('end', function() {
    output(CleanCSS.process(text, cleanOptions));
  });
}

function output(cleaned) {
  if (options.target)
    fs.writeFileSync(options.target, cleaned, 'utf8');
  else
    process.stdout.write(cleaned);
};
