// Copyright 2014 The Flutter 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:async';

import 'package:completion/completion.dart';

import '../base/common.dart';
import '../base/file_system.dart';
import '../base/io.dart';
import '../runner/flutter_command.dart';

class ShellCompletionCommand extends FlutterCommand {
  ShellCompletionCommand() {
    argParser.addFlag(
      'overwrite',
      defaultsTo: false,
      negatable: true,
      help: 'Causes the given shell completion setup script to be overwritten if it already exists.',
    );
  }

  @override
  final String name = 'bash-completion';

  @override
  final String description = 'Output command line shell completion setup scripts.\n\n'
      'This command prints the flutter command line completion setup script for Bash and Zsh. To '
      'use it, specify an output file and follow the instructions in the generated output file to '
      'install it in your shell environment. Once it is sourced, your shell will be able to '
      'complete flutter commands and options.';

  @override
  final List<String> aliases = <String>['zsh-completion'];

  @override
  bool get shouldUpdateCache => false;

  /// Return null to disable analytics recording of the `bash-completion` command.
  @override
  Future<String> get usagePath async => null;

  @override
  Future<FlutterCommandResult> runCommand() async {
    if (argResults.rest.length > 1) {
      throwToolExit('Too many arguments given to bash-completion command.', exitCode: 1);
    }

    if (argResults.rest.isEmpty || argResults.rest.first == '-') {
      stdout.write(generateCompletionScript(<String>['flutter']));
      return null;
    }

    final File outputFile = fs.file(argResults.rest.first);
    if (outputFile.existsSync() && !boolArg('overwrite')) {
      throwToolExit(
        'Output file ${outputFile.path} already exists, will not overwrite. '
            'Use --overwrite to force overwriting existing output file.',
        exitCode: 1,
      );
    }
    try {
      outputFile.writeAsStringSync(generateCompletionScript(<String>['flutter']));
    } on FileSystemException catch (error) {
      throwToolExit('Unable to write shell completion setup script.\n$error', exitCode: 1);
    }

    return null;
  }
}
