// Copyright (c) 2024, 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.

// TODO(bkonyi): consider moving to lib/ once this package is no longer shipped
// via pub.

import 'package:args/args.dart';

abstract class DartDevelopmentServiceOptions {
  static const vmServiceUriOption = 'vm-service-uri';
  static const bindAddressOption = 'bind-address';
  static const bindPortOption = 'bind-port';
  static const disableServiceAuthCodesFlag = 'disable-service-auth-codes';
  static const serveDevToolsFlag = 'serve-devtools';
  static const enableServicePortFallbackFlag = 'enable-service-port-fallback';
  static const cachedUserTagsOption = 'cached-user-tags';
  static const devToolsServerAddressOption = 'devtools-server-address';
  static const google3WorkspaceRootOption = 'google3-workspace-root';
  static const appNameOption = 'app-name';

  static ArgParser createArgParser({
    int? usageLineLength,
    bool verbose = false,
    bool includeHelp = false,
  }) {
    final args = ArgParser(usageLineLength: usageLineLength);
    populateArgParser(
      argParser: args,
      verbose: verbose,
      includeHelp: includeHelp,
    );
    return args;
  }

  static void populateArgParser({
    required ArgParser argParser,
    bool verbose = false,
    bool includeHelp = false,
  }) {
    argParser
      ..addOption(
        vmServiceUriOption,
        help: 'The VM service URI DDS will connect to.',
        valueHelp: 'uri',
        mandatory: true,
      )
      ..addOption(bindAddressOption,
          help: 'The address DDS should bind to.',
          valueHelp: 'address',
          defaultsTo: 'localhost')
      ..addOption(
        bindPortOption,
        help: 'The port DDS should be served on.',
        valueHelp: 'port',
        defaultsTo: '0',
      )
      ..addFlag(
        disableServiceAuthCodesFlag,
        help: 'Disables authentication codes.',
      )
      ..addFlag(
        serveDevToolsFlag,
        help: 'If provided, DDS will serve DevTools. If not specified, '
            '"--$devToolsServerAddressOption" is ignored.',
      )
      ..addOption(
        devToolsServerAddressOption,
        help: 'Redirect to an existing DevTools server. Ignored if '
            '"--$serveDevToolsFlag" is not specified.',
      )
      ..addFlag(
        enableServicePortFallbackFlag,
        help: 'Bind to a random port if DDS fails to bind to the provided '
            'port.',
      )
      ..addMultiOption(
        cachedUserTagsOption,
        help: 'This option is deprecated and supplying it will cause no '
            'effect.',
        defaultsTo: <String>[],
      )
      ..addOption(
        google3WorkspaceRootOption,
        help: 'Sets the Google3 workspace root used for google3:// URI '
            'resolution.',
        hide: !verbose,
      )
      ..addOption(
        appNameOption,
        help: 'A short, user focused description of the application that DDS '
            'will connect to.',
      );
    if (includeHelp) {
      argParser.addFlag('help', negatable: false);
    }
  }
}
