// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:io';

import 'package:args/args.dart';
import 'package:logging/logging.dart';
import 'package:sky_tools/src/common.dart';
import 'package:sky_tools/src/init.dart';
import 'package:sky_tools/src/install.dart';

void main(List<String> args) {
  Logger.root.level = Level.WARNING;
  Logger.root.onRecord.listen((LogRecord rec) {
    print('${rec.level.name}: ${rec.message}');
    if (rec.error != null) {
      print(rec.error);
    }
    if (rec.stackTrace != null) {
      print(rec.stackTrace);
    }
  });

  Map<String, CommandHandler> handlers = {};

  ArgParser parser = new ArgParser();
  parser.addSeparator('options:');
  parser.addFlag('help',
      abbr: 'h', negatable: false, help: 'Display this help message.');
  parser.addFlag('verbose',
      abbr: 'v',
      negatable: false,
      help: 'Noisy logging, including all shell commands executed.');
  parser.addFlag('very-verbose',
      negatable: false,
      help: 'Very noisy logging, including the output of all '
          'shell commands executed.');
  parser.addSeparator('commands:');

  for (CommandHandler handler in [
    new InitCommandHandler(),
    new InstallCommandHandler()
  ]) {
    parser.addCommand(handler.name, handler.parser);
    handlers[handler.name] = handler;
  }

  ArgResults results;

  try {
    results = parser.parse(args);
  } catch (e) {
    _printUsage(parser, handlers, e is FormatException ? e.message : '${e}');
    exit(1);
  }

  if (results['verbose']) {
    Logger.root.level = Level.INFO;
  }

  if (results['very-verbose']) {
    Logger.root.level = Level.FINE;
  }

  if (results['help']) {
    _printUsage(parser, handlers);
  } else if (results.command != null) {
    handlers[results.command.name]
        .processArgResults(results.command)
        .then((int code) => exit(code))
        .catchError((e, stack) {
      print('Error running ' + results.command.name + ': $e');
      print(stack);
      exit(2);
    });
  } else {
    _printUsage(parser, handlers, 'No command specified.');
    exit(1);
  }
}

void _printUsage(ArgParser parser, Map<String, CommandHandler> handlers,
    [String message]) {
  if (message != null) {
    print('${message}\n');
  }
  print('usage: sky_tools <command> [arguments]');
  print('');
  print(parser.usage);
  handlers.forEach((String command, CommandHandler handler) {
    print('  ${command.padRight(10)} ${handler.description}');
  });
}
