// Copyright (c) 2019, 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:io';

import 'package:dwds/dwds.dart' show ModuleStrategy;

import '../utilities/wrapped_service.dart';

VMRef toVMRef(VM vm) => VMRef()..name = vm.name;

int _nextId = 0;
String createId() {
  _nextId++;
  return '$_nextId';
}

/// Returns a port that is probably, but not definitely, not in use.
///
/// This has a built-in race condition: another process may bind this port at
/// any time after this call has returned.
Future<int> findUnusedPort() async {
  int port;
  ServerSocket socket;
  try {
    socket =
        await ServerSocket.bind(InternetAddress.loopbackIPv6, 0, v6Only: true);
  } on SocketException {
    socket = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
  }
  port = socket.port;
  await socket.close();
  return port;
}

String _fetchModuleStrategy(ModuleStrategy config) {
  switch (config) {
    case ModuleStrategy.legacy:
      return 'dart_library.import';
    case ModuleStrategy.requireJS:
      return 'require';
  }
  throw StateError('Unreachable code');
}

ModuleStrategy globalModuleStrategy;
String get loadModule => _fetchModuleStrategy(globalModuleStrategy);

String get getLibraries {
  var expression = '';
  if (globalModuleStrategy == ModuleStrategy.legacy) {
    expression += 'for(let module of dart_library.libraries()) {\n'
        'dart_library.import(module)[module];\n'
        '}\n';
  }
  return expression +=
      "let libs = $loadModule('dart_sdk').dart.getLibraries();\n";
}
