/*jshint esversion:6*/
'use strict';

const Application = require('..').Application;

//config here is a gkeypath Wrapper instance
const config = Application.loadConfig({}, true);

const app = new Application({ config });

app.resolve('repl').then(repl => {
    repl.updateContext('myCustomCommand', function() {
        console.log('TODO: We should really thing of a better example!');
    });
});

app.onceRegistered('dispatcher', () => {
    app.chainEvents(['run.pre', 'run'], ['error']).then(() => {
        app.logger.error('A) RUN.PRE AND RUN DONE!');
    }).catch();

    app.chainEvents(['run.pre', 'run', 'run.post'], ['error']).then(() => {
        app.logger.error('B) RUN.PRE, RUN AND RUN.POST DONE!');
    });
});

app.onceRegistered('logger', () => {
    // app.logger.mute('core', 'app');
    // app.logger.focus('core');
    // app.logger.focus('data-manager');
});

app.once('run.complete', function(e) {
    app.logger.debug('>> run.complete: ');
    // app.logger.debug('some info %s', Object.keys(app.config));
});

app.once('run.pre', function(e) {
    app.logger.debug('run.pre: ', e);
    app.logger.debug('TEST LOGGER: %s', e, { age: 23, name: 'Pepe Rone' });
});

app.once('run.post', function() {
    app.logger.debug('--------');
    app.logger.debug(this.name);
    app.logger.debug(this.nicename);
    app.logger.debug('--------');

    console.log('------------------');
    console.log('here, here, here');
    console.log('------------------');

    // let err = new Error('This is a sample error!!!');
    // app.logger.error(err.stack);
    const watcher = require('chokidar');

    const commandReload = watcher.watch(app._commandspath, {
        depth: 0,
        ignoreInitial: false,
        awaitWriteFinish: true
    });

    app.watcher = commandReload;

    commandReload.on('change', (filepath, stats) => {
        app.logger.info('command updated', filepath);
        app.reloadCommand(filepath, requireUncached(filepath));
    });
});

app.once('coreplugins.ready', () => {
    app.run();
});

function requireUncached(mdl) {
    delete require.cache[require.resolve(mdl)];
    return require(mdl);
}
@@ -1360,181 +1360,8 @@
 );%0A%0A
-    console.log('------------------');%0A    console.log('here, here, here');%0A    console.log('------------------');%0A%0A    // let err = new Error('This is a sample error!!!');%0A
     
@@ -1806,58 +1806,973 @@
 );%0A%0A
-app.once('coreplugins.ready', () =%3E %7B%0A    app.run(
+%0A/**%0A * Once the application has bootstraped%0A * then we can start the application.%0A * - coreplugins.ready (commands and plugins not loaded)%0A * - modules.ready%0A * - commands.ready%0A */%0Aapp.once('modules.ready', _ =%3E %7B%0A    app.logger.info('modules ready!');%0A    app.run();%0A%7D);%0A%0Aapp.once('coreplugins.ready', () =%3E %7B%0A    app.logger.info('core modules resolved!');%0A%7D);%0A%0Aapp.once('modules.resolved', _ =%3E %7B%0A    app.logger.info('modules resolved!');%0A%7D);%0A%0Aapp.once('context.ready', _ =%3E %7B%0A%0A    app.logger.warn('----------------------');%0A    app.logger.info('app running');%0A    app.logger.warn('----------------------');%0A%7D);%0A%0Aapp.once('media.registered', _ =%3E %7B%0A    app.logger.warn('----------------------');%0A    app.logger.info('media.registered');%0A    app.logger.warn('----------------------');%0A%7D);%0A%0Aapp.once('service.registered', _ =%3E %7B%0A    app.logger.warn('----------------------');%0A    app.logger.info('service.registered');%0A    app.logger.warn('----------------------'
 );%0A%7D

update example