#!/usr/bin/env node
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
'use strict';

/**
 * This file is useful for not having to load bootstrap-local in various javascript.
 * Simply use package.json to have npm scripts that use this script as well, or use
 * this script directly.
 */
require('../lib/bootstrap-local');


const minimist = require('minimist');
const path = require('path');

const args = minimist(process.argv.slice(2), {
  boolean: ['verbose']
});
const scriptName = args._.shift();
const scriptPath = path.join('../scripts', scriptName);

const cwd = process.cwd();
process.chdir(path.join(__dirname, '..'));


// This might get awkward, so we fallback to console if there was an error.
let logger = null;
try {
  logger = new (require('@angular-devkit/core').logging.IndentLogger)('root');
  const { bold, gray, red, yellow, white } = require('@angular-devkit/core').terminal;
  const filter = require('rxjs/operators').filter;

  logger
    .pipe(filter(entry => (entry.level !== 'debug' || args.verbose)))
    .subscribe(entry => {
      let color = gray;
      let output = process.stdout;
      switch (entry.level) {
        case 'info': color = white; break;
        case 'warn': color = yellow; break;
        case 'error': color = red; output = process.stderr; break;
        case 'fatal': color = x => bold(red(x)); output = process.stderr; break;
      }

      output.write(color(entry.message) + '\n');
    });
} catch (e) {
  console.error(`Reverting to manual console logging.\nReason: ${e.message}.`);
  logger = {
    debug: console.log.bind(console),
    info: console.log.bind(console),
    warn: console.warn.bind(console),
    error: console.error.bind(console),
    fatal: x => { console.error(x); process.exit(100); },
    createChild: () => logger,
  };
}


try {
  Promise.resolve()
    .then(() => require(scriptPath).default(args, logger, cwd))
    .then(exitCode => process.exit(exitCode || 0))
    .catch(err => {
      logger.fatal(err.stack);
      process.exit(99);
    });
} catch (err) {
  logger.fatal(err.stack);
  process.exit(99);
}
