#!/usr/bin/env node
var tokens = process.argv.slice(2, process.argv.length),
    cordova= require('../cordova');

var cmd, version = false, verbose = false, current;

while (current = tokens.shift()) {
    if (current[0] == '-') {
        if (current.indexOf('version') > -1 || current[1] == 'v') version = true;
        if (current.indexOf('verbose') > -1 || current[1] == 'd') verbose = true;
    } else {
        cmd = current;
        break;
    }
}

// provide clean output on exceptions rather than dumping a stack trace
process.on('uncaughtException', function(err){
	console.error(err);
    process.exit(1);
});
cordova.on('result', console.log);
if (verbose) {
    cordova.on('log', console.log);
    cordova.on('warn', console.warn);
    process.on('uncaughtException', function(err) { console.error(err.stack) });
}

if (version) {
    console.log(require('../package').version);
} else if (cmd === undefined) {
    console.log(cordova.help());
} else if (cordova.hasOwnProperty(cmd)) {
    var opts = Array.prototype.slice.call(tokens, 0);
    if (cmd == 'create' || cmd == 'docs' || cmd == 'serve') {
        cordova[cmd].apply(this, opts);
    } else if (cmd == 'emulate' || cmd == 'build' || cmd == 'prepare' || cmd == 'compile' || cmd == 'run') {
        cordova[cmd].call(this, opts);
    } else {
        // platform or plugin cmds
        if (tokens.length > 2) {
            opts = [tokens.shift()];
            opts.push(tokens);
        }
        cordova[cmd].apply(this, opts);
    }
} else {
    throw new Error('Cordova does not know ' + cmd + '; try help for a list of all the available commands.');
}
