// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.9

import 'dart:async';

import 'package:args/args.dart';
import 'package:args/command_runner.dart';

import 'command/build_command.dart';
import 'command/daemon_command.dart';
import 'command/serve_command.dart';
import 'util.dart';
import 'version.dart';

export 'pubspec.dart' show PackageException;
export 'util.dart' show appName;

Future<int> run(List<String> args) => _CommandRunner().run(args);

class _CommandRunner extends CommandRunner<int> {
  _CommandRunner() : super(appName, 'A tool to develop Dart web projects.') {
    argParser.addFlag('version',
        negatable: false, help: 'Prints the version of webdev.');
    addCommand(BuildCommand());
    addCommand(ServeCommand());
    addCommand(DaemonCommand());
  }

  @override
  Future<int> runCommand(ArgResults topLevelResults) async {
    if (topLevelResults['version'] as bool) {
      print(packageVersion);
      return 0;
    }

    // In the case of `help`, `null` is returned. Treat that as success.
    return await super.runCommand(topLevelResults) ?? 0;
  }
}
