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

/// A class that can return memory and cpu usage information for a given
/// process.
abstract class ProcessProfiler {
  ProcessProfiler._();

  Future<UsageInfo> getProcessUsage(int processId);

  /// Return a [ProcessProfiler] instance suitable for the current host
  /// platform. This can return `null` if we're not able to gather memory and
  /// cpu information for the current platform.
  static ProcessProfiler getProfilerForPlatform() {
    if (Platform.isLinux || Platform.isMacOS) {
      return new _PosixProcessProfiler();
    }

    // Not a supported platform.
    return null;
  }
}

class UsageInfo {
  /// A number between 0.0 and 100.0 * the number of host CPUs (but typically
  /// never more than slightly above 100.0).
  final double cpuPercentage;

  /// The process memory usage in kilobytes.
  final int memoryKB;

  UsageInfo(this.cpuPercentage, this.memoryKB);

  double get memoryMB => memoryKB / 1024;

  String toString() => '$cpuPercentage% ${memoryMB.toStringAsFixed(1)}MB';
}

class _PosixProcessProfiler extends ProcessProfiler {
  static final RegExp stringSplitRegExp = new RegExp(r'\s+');

  _PosixProcessProfiler() : super._();

  @override
  Future<UsageInfo> getProcessUsage(int processId) {
    try {
      // Execution time is typically 2-4ms.
      Future<ProcessResult> future =
          Process.run('ps', ['-o', '%cpu=,rss=', processId.toString()]);
      return future.then((ProcessResult result) {
        if (result.exitCode != 0) {
          return new Future.value(null);
        }

        return new Future.value(_parse(result.stdout));
      });
    } catch (e) {
      return new Future.error(e);
    }
  }

  UsageInfo _parse(String psResults) {
    try {
      // "  0.0 378940"
      String line = psResults.split('\n').first.trim();
      List<String> values = line.split(stringSplitRegExp);
      return new UsageInfo(double.parse(values[0]), int.parse(values[1]));
    } catch (e) {
      return null;
    }
  }
}
