#!/usr/bin/env node
var minimist = require('minimist');
var assert = require('assert');
var myth = require('myth');
var rework = require('rework');
var inherit = require('rework-inherit');
var path = require('path');
var fs = require('fs');
var argv = minimist(process.argv.slice(2));
var infile = argv._[0];

if (! infile) {
  var err = new Error('Missing infile, try `./bin/compile-css <infile>`');
  return exit(err);
}

read(infile, function onstring(err, string) {
  if (err) {
    return exit(err);
  }

  compile(string, function onCSS(err, css){
    if (err) {
      exit(err);
    } else {
      process.stdout.write(css);
    }
  });
});


// # compile-css
//
// This is a quick css pre-processor based on `myth`, once we start to
// standardize the css this should get bundled up into a module.
//
// ## Usage
//
// There is no bin so right now use node to run this:
//
//     node rework-css.js <infile>
//
// This program will spit out the compiled CSS to stdout. Redirect with `>`:
//
//     node rework-css.js stylesheets/index.css > public/bundle.css
//
function compile(string, callback) {
  assert.ok(string, 'Missing string argument');
  assert.ok(callback, 'Missing callback argument');

  var css;
  var err;

  // myth/rework has a sync api that throws :/
  try {
    css = preprocess(string);
  } catch (e) {
    err = e;
  }

  callback(err, css);
}

// wraps the call to rework with all the options and plugins
function preprocess(string) {
  var css = myth(string, {
    compress: true,
    source: infile
  })

  return rework(css)
  .use(inherit())
  .toString();
}

function read(file, callback) {
  file = path.resolve(file);
  fs.readFile(file, 'utf8', callback);
}

function exit(err) {
  if (err) {
    console.error(err.stack);
  }

  process.exit(1);
}
