#!/usr/bin/env node

var path = require('path'),
    fs = require('fs'),
    sys = require('sys');

require.paths.unshift(path.join(__dirname, '..', 'lib'));

var less = require('less');
var args = process.argv.slice(1);
var options = {
    compress: false,
    optimization: 1
};

args = args.filter(function (arg) {
    var match;

    if (match = arg.match(/^--?([a-z][a-z-]*)$/i)) { arg = match[1] }
    else { return arg }

    switch (arg) {
        case 'v':
        case 'version':
            sys.puts("lessc " + less.version.join('.') + " (LESS Compiler) [JavaScript]");
            process.exit(0);
        case 'h':
        case 'help':
            sys.puts("usage: lessc source [destination]");
            process.exit(0);
        case 'x':
        case 'compress':
            options.compress = true;
            break;
        case 'O0': options.optimization = 0; break;
        case 'O1': options.optimization = 1; break;
        case 'O2': options.optimization = 2; break;
    }
});

var input = args[1];
if (input && input[0] != '/') {
    input = path.join(process.cwd(), input);
}
var output = args[2];
if (output && output[0] != '/') {
    output = path.join(process.cwd(), output);
}

var css, fd, tree;

if (! input) {
    sys.puts("lessc: no input files");
    process.exit(1);
}

fs.stat(input, function (e, stats) {
    if (e) {
        sys.puts("lessc: " + e.message);
        process.exit(1);
    }
    fs.open(input, process.O_RDONLY, stats.mode, function (e, fd) {
        fs.read(fd, stats.size, 0, "utf8", function (e, data) {
            new(less.Parser)({
                paths: [path.dirname(input)],
                optimization: options.optimization,
                filename: input
            }).parse(data, function (err, tree) {
                if (err) {
                    less.writeError(err);
                } else {
                    try {
                        css = tree.toCSS({ compress: options.compress });
                        if (output) {
                            fd = fs.openSync(output, "w");
                            fs.writeSync(fd, css, 0, "utf8");
                        } else {
                            sys.print(css);
                        }
                    } catch (e) {
                        less.writeError(e);
                    }
                }
            });
        });
    });
});

