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

import 'dart:convert';
import 'dart:io';

import 'package:dds/dds.dart';

/// A simple program which starts a [DartDevelopmentService] instance with a
/// basic configuration.
///
/// Takes the following positional arguments:
///   - VM service URI
///   - DDS bind address
///   - DDS port
///   - Disable service authentication codes
///   - Start DevTools
///   - DevTools build directory
///   - Enable logging
Future<void> main(List<String> args) async {
  if (args.isEmpty) return;

  // This URI is provided by the VM service directly so don't bother doing a
  // lookup.
  final remoteVmServiceUri = Uri.parse(args.first);

  // Resolve the address which is potentially provided by the user.
  late InternetAddress address;
  final addresses = await InternetAddress.lookup(args[1]);
  // Prefer IPv4 addresses.
  for (int i = 0; i < addresses.length; i++) {
    address = addresses[i];
    if (address.type == InternetAddressType.IPv4) break;
  }
  final serviceUri = Uri(
    scheme: 'http',
    host: address.address,
    port: int.parse(args[2]),
  );
  final disableServiceAuthCodes = args[3] == 'true';

  final startDevTools = args[4] == 'true';
  Uri? devToolsBuildDirectory;
  if (args[5].isNotEmpty) {
    devToolsBuildDirectory = Uri.file(args[5]);
  }
  final logRequests = args[6] == 'true';
  try {
    // TODO(bkonyi): add retry logic similar to that in vmservice_server.dart
    // See https://github.com/dart-lang/sdk/issues/43192.
    final dds = await DartDevelopmentService.startDartDevelopmentService(
      remoteVmServiceUri,
      serviceUri: serviceUri,
      enableAuthCodes: !disableServiceAuthCodes,
      ipv6: address.type == InternetAddressType.IPv6,
      devToolsConfiguration: startDevTools && devToolsBuildDirectory != null
          ? DevToolsConfiguration(
              enable: startDevTools,
              customBuildDirectoryPath: devToolsBuildDirectory,
            )
          : null,
      logRequests: logRequests,
    );
    stderr.write(json.encode({
      'state': 'started',
      if (dds.devToolsUri != null) 'devToolsUri': dds.devToolsUri.toString(),
    }));
  } catch (e, st) {
    stderr.write(json.encode({
      'state': 'error',
      'error': '$e',
      'stacktrace': '$st',
    }));
  }
}
