// 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 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,
      );
    if (includeHelp) {
      argParser.addFlag('help', negatable: false);
    }
  }
}
