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

// @dart = 2.9

import 'dart:developer';
import 'dart:isolate' as I;

import 'package:vm_service/vm_service.dart';
import 'package:vm_service/vm_service_io.dart';

int fib(int n) {
  if (n <= 1) return n;
  return fib(n - 1) + fib(n - 2);
}

Future<void> main() async {
  // Do some work.
  fib(20);

  ServiceProtocolInfo serviceInfo = await Service.getInfo();
  while (serviceInfo.serverUri == null) {
    await Future.delayed(const Duration(milliseconds: 200));
    serviceInfo = await Service.getInfo();
  }
  final isolateId = Service.getIsolateID(I.Isolate.current);
  final uri = serviceInfo.serverUri.replace(scheme: 'ws', pathSegments: [
    ...serviceInfo.serverUri.pathSegments.where((e) => e != ''),
    'ws'
  ]);
  final service = await vmServiceConnectUri(uri.toString());
  final timeExtent = Duration(minutes: 5).inMicroseconds;
  final samples = await service.getCpuSamples(isolateId, 0, timeExtent);

  // Cleanup VM service connection as it's no longer needed.
  await service.dispose();

  final functions = samples.functions.where((f) => f.kind == 'Dart').toList();
  if (functions.isEmpty) {
    print('FAILED: could not find a profiled Dart function');
    return;
  }

  functions.retainWhere((f) => f.resolvedUrl.isNotEmpty);
  if (functions.isNotEmpty) {
    print('SUCCESS');
  } else {
    print('FAILED');
  }
}
