/// <reference path="./cli.d.ts" />

import * as cli from "cli";

// ========================================================================
// Example: https://github.com/node-js-libs/cli/blob/master/examples/cat.js
// ========================================================================

var output_file = function(file: string) {
    cli.withInput(file, function (line, sep, eof) {
        if (!eof) {
            cli.output(line + sep);
        } else if (cli.args.length) {
            output_file(cli.args.shift());
        }
    });
};

if (cli.args.length) {
    output_file(cli.args.shift());
}

// ============================================================================
// Example: https://github.com/node-js-libs/cli/blob/master/examples/command.js
// ============================================================================

cli.parse(null, ['install', 'test', 'edit', 'remove', 'uninstall', 'ls']);

console.log('Command is: ' + cli.command);


// ============================================================================
// Example: https://github.com/node-js-libs/cli/blob/master/examples/echo.js
// ============================================================================

cli.parse({
    newline:   ['n', 'Do not output the trailing newline'],
    escape:    ['e', 'Enable interpretation of backslash escapes'],
    separator: ['s', 'Separate arguments using this value', 'string', ' '],
    output:    [false, 'Write to FILE rather than the console', 'file']
});

cli.main(function (args, options) {
    var output = '', i: any, j: any, l: number, output_stream: NodeJS.WritableStream;

    if (this.argc) {
        if (options.escape) {
            var replace: any = {'\\n':'\n','\\r':'\r','\\t':'\t','\\e':'\e','\\v':'\v','\\f':'\f','\\c':'\c','\\b':'\b','\\a':'\a','\\\\':'\\'};
            var escape = function (str: string) {
                str += '';
                for (j in replace) {
                    str = str.replace(i, replace[i]);
                }
                return str;
            }
            for (i = 0, l = this.argc; i < l; i++) {
                args[i] = escape(args[i]);
            }
            options.separator = escape(options.separator);
        }
        output += args.join(options.separator);
    }

    if (!options.newline) {
        output += '\n';
    }

    try {
        if (options.output) {
            output_stream = this.native.fs.createWriteStream(options.output)
        } else {
            output_stream = process.stdout;
        }
        output_stream.write(output);
    } catch (e) {
        this.fatal('Could not write to output stream');
    }
});


// =========================================================================
// Example: https://github.com/node-js-libs/cli/blob/master/examples/glob.js
// =========================================================================

cli.enable('glob');

//Running `./glob.js *.js` will output a list of .js files in this directory
console.log(cli.args);


// ==============================================================================
// Example: https://github.com/node-js-libs/cli/blob/master/examples/long_desc.js
// ==============================================================================

//You can (optionally) boost the width of output with:
cli.width = 120;

//You can also adjust the width of the options/command definitions
cli.option_width = 25;

var long_desc = 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s '
              + 'standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make'
              + ' a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, '
              + 'remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing '
              + 'Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions'
              + ' of Lorem Ipsum.';

cli.parse({
    foo: ['f', long_desc]
});


// =============================================================================
// Example: https://github.com/node-js-libs/cli/blob/master/examples/progress.js
// =============================================================================

var i = 0, interval = setInterval(function () {
    cli.progress(++i / 100);
    if (i === 100) {
        clearInterval(interval);
        cli.ok('Finished!');
    }
}, 50);


// =========================================================================
// Example: https://github.com/node-js-libs/cli/blob/master/examples/sort.js
// =========================================================================

var options = cli.parse({
    numeric: ['n', 'Compare using a numeric sort'],
    reverse: ['r', 'Reverse the results']
});

cli.withStdinLines(function (lines, newline) {
    lines.sort(!options.numeric ? null : function (a, b) {
        return parseInt(a) - parseInt(b);
    });
    if (options.reverse) {
        lines.reverse();
    }
    this.output(lines.join(newline));
});


// ============================================================================
// Example: https://github.com/node-js-libs/cli/blob/master/examples/spinner.js
// ============================================================================

cli.spinner('Working..');

setTimeout(function () {
    cli.spinner('Working.. done!', true); //End the spinner
}, 3000);


// ===========================================================================
// Example: https://github.com/node-js-libs/cli/blob/master/examples/static.js
// ===========================================================================

cli.parse({
    log:   ['l', 'Enable logging'],
    port:  ['p', 'Listen on this port', 'number', 8080],
    serve: [false, 'Serve static files from PATH', 'path', './public']
});

cli.main(function (args, options) {
    var server: any, middleware: any = [];

    if (options.log) {
        this.debug('Enabling logging');
        middleware.push(require('creationix/log')());
    }

    this.debug('Serving files from ' + options.serve);
    middleware.push(require('creationix/static')('/', options.serve, 'index.html'));

    server = this.createServer(middleware).listen(options.port);

    this.ok('Listening on port ' + options.port);
});
