// 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 flutterFromPathEnvValue =
        Platform.environment[_flutterFromPathEnvVar] ?? '';
    final flutterFromPathEnv =
        bool.tryParse(flutterFromPathEnvValue, caseSensitive: false) == 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);
  }
}
