// Copyright 2020 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd.

import 'dart:io';

import 'package:args/args.dart';
import 'package:args/command_runner.dart';
import 'package:devtools_tool/commands/build.dart';
import 'package:devtools_tool/commands/fix_goldens.dart';
import 'package:devtools_tool/commands/generate_code.dart';
import 'package:devtools_tool/commands/release_notes_helper.dart';
import 'package:devtools_tool/commands/run.dart';
import 'package:devtools_tool/commands/serve.dart';
import 'package:devtools_tool/commands/sync.dart';
import 'package:devtools_tool/commands/tag_version.dart';
import 'package:devtools_tool/commands/update_flutter_sdk.dart';
import 'package:devtools_tool/commands/update_perfetto.dart';
import 'package:devtools_tool/model.dart';

import 'commands/analyze.dart';
import 'commands/list.dart';
import 'commands/presubmit.dart';
import 'commands/pub_get.dart';
import 'commands/release_helper.dart';
import 'commands/repo_check.dart';
import 'commands/rollback.dart';
import 'commands/update_dart_sdk_deps.dart';
import 'commands/update_version.dart';

const _flutterFromPathFlag = 'flutter-from-path';

const _flutterFromPathEnvVar = 'DEVTOOLS_TOOL_FLUTTER_FROM_PATH';

const _flutterSdkPathFlag = 'flutter-sdk-path';

class DevToolsCommandRunner extends CommandRunner {
  DevToolsCommandRunner()
    : super('dt', 'A repo management tool for DevTools.') {
    addCommand(AnalyzeCommand());
    addCommand(BuildCommand());
    addCommand(FixGoldensCommand());
    addCommand(GenerateCodeCommand());
    addCommand(ListCommand());
    addCommand(PresubmitCommand());
    addCommand(PubGetCommand());
    addCommand(ReleaseHelperCommand());
    addCommand(ReleaseNotesCommand());
    addCommand(RepoCheckCommand());
    addCommand(RollbackCommand());
    addCommand(RunCommand());
    addCommand(ServeCommand());
    addCommand(SyncCommand());
    addCommand(TagVersionCommand());
    addCommand(UpdateDartSdkDepsCommand());
    addCommand(UpdateDevToolsVersionCommand());
    addCommand(UpdateFlutterSdkCommand());
    addCommand(UpdatePerfettoCommand());

    argParser
      ..addFlag(
        _flutterFromPathFlag,
        abbr: 'p',
        negatable: false,
        help:
            'Use the Flutter SDK on PATH for any `flutter`, `dart` and '
            '`dt` commands spawned by this process, instead of the '
            'Flutter SDK from tool/flutter-sdk which is used by default. '
            'This is incompatible with the `$_flutterSdkPathFlag` flag. '
            'Can also be enabled via the `$_flutterFromPathEnvVar` '
            'environment variable.',
      )
      ..addOption(
        _flutterSdkPathFlag,
        help:
            'Use the Flutter SDK from the specified path for any `flutter`, '
            '`dart`, and `dt` commands spawned by this process, instead of the '
            'Flutter SDK from tool/flutter-sdk which is used by default. '
            'This is incompatible with the `$_flutterFromPathFlag` flag.',
      );
  }

  @override
  Future<void> runCommand(ArgResults topLevelResults) {
    final flutterFromPathEnv =
        Platform.environment[_flutterFromPathEnvVar]?.isNotEmpty == true;
    if (topLevelResults.flag(_flutterFromPathFlag) &&
        topLevelResults.wasParsed(_flutterSdkPathFlag)) {
      throw ArgParserException(
        'Only one of `$_flutterFromPathFlag` and `$_flutterSdkPathFlag` may be passed',
      );
    }
    if (topLevelResults.wasParsed(_flutterSdkPathFlag)) {
      FlutterSdk.useFromPath(topLevelResults.option(_flutterSdkPathFlag)!);
    } else if (topLevelResults.flag(_flutterFromPathFlag) ||
        flutterFromPathEnv) {
      FlutterSdk.useFromPathEnvironmentVariable();
    } else {
      FlutterSdk.useFromCurrentVm();
    }
    print('Using Flutter SDK from ${FlutterSdk.current.sdkPath}');

    return super.runCommand(topLevelResults);
  }
}
