// 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:async';

import 'package:observatory_2/service_io.dart';
import 'service_test_common.dart';

const String clientName = 'TestClient';
const String otherClientName = 'OtherTestClient';

Future<void> setClientName(WebSocketVM client, String name) async =>
    await client.invokeRpc('setClientName', {'name': name});

Future<WebSocketVM> createClient(WebSocketVM vm,
    {String clientName: clientName}) async {
  final client = WebSocketVM(vm.target);
  await client.load();
  await setClientName(client, clientName);
  return client;
}

Future<void> setRequireApprovalForResume(
  WebSocketVM vm,
  Isolate isolate, {
  bool pauseOnStart: false,
  bool pauseOnExit: false,
  bool pauseOnReload: false,
}) async {
  int pauseTypeMask = 0;
  if (pauseOnStart) {
    pauseTypeMask |= 1;
  }
  if (pauseOnReload) {
    pauseTypeMask |= 2;
  }
  if (pauseOnExit) {
    pauseTypeMask |= 4;
  }
  await vm.invokeRpc('requirePermissionToResume', {
    'isolateId': isolate.id,
    'pauseTypeMask': pauseTypeMask,
    'onPauseStart': pauseOnStart,
    'onPauseReload': pauseOnReload,
    'onPauseExit': pauseOnExit,
  });
}

Future<void> resume(WebSocketVM vm, Isolate isolate) async =>
    await vm.invokeRpc('resume', {
      'isolateId': isolate.id,
    });

Future<bool> isPausedAtStart(Isolate isolate) async {
  await isolate.reload();
  return ((isolate.pauseEvent != null) &&
      isEventOfKind(isolate.pauseEvent, ServiceEvent.kPauseStart));
}

Future<bool> isPausedAtExit(Isolate isolate) async {
  await isolate.reload();
  return ((isolate.pauseEvent != null) &&
      isEventOfKind(isolate.pauseEvent, ServiceEvent.kPauseExit));
}

Future<bool> isPausedPostRequest(Isolate isolate) async {
  await isolate.reload();
  return ((isolate.pauseEvent != null) &&
      isEventOfKind(isolate.pauseEvent, ServiceEvent.kPausePostRequest));
}

Future<void> waitForResume(Isolate isolate) async {
  final completer = Completer<bool>();
  isolate.vm.getEventStream(VM.kDebugStream).then((stream) {
    var subscription;
    subscription = stream.listen((ServiceEvent event) {
      if (event.kind == ServiceEvent.kResume) {
        subscription.cancel();
        completer.complete();
      }
    });
  });
  return completer.future;
}
