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

library tracer;

import 'dart:async';

import 'package:logging/logging.dart';

_deepCopy(src) {
  if (src is Map) {
    var dest = {};
    src.forEach((key, val) {
      dest[key] = _deepCopy(val);
    });
    return dest;
  } else if (src is List) {
    var dest = [];
    src.forEach((val) {
      dest.add(_deepCopy(val));
    });
    return dest;
  } else {
    return src;
  }
}

class TraceEvent {
  TraceEvent.msg(this._time, this.message, Map? originalMap) {
    map = _deepCopy(originalMap);
  }

  String get timeStamp => "T+${_time}us";

  String toString() {
    return "[${timeStamp}] ${message}";
  }

  int _time;
  String message;
  Map? map;
}

class Tracer {
  // The current global tracer.
  static Tracer? get current => _current;

  static Tracer? _current;

  static void start() {
    if (_current == null) {
      _current = new Tracer();
    }
  }

  static void stop() {
    if (_current != null) {
      _current!.cancel();
      _current = null;
    }
  }

  // The tracer subscribes to all logging events.
  StreamSubscription? loggerSub = null;

  // The start time for the current request.
  Stopwatch? _time;

  // A list of all tracing events for thre current request.
  List<TraceEvent> events = <TraceEvent>[];

  Tracer() {
    _time = new Stopwatch();
    _time!.start();
    loggerSub = Logger.root.onRecord.listen((LogRecord rec) {
      // Echo all log messages to the trace.
      trace('${rec.level.name}: ${rec.message}');
    });
    reset();
  }

  void cancel() {
    loggerSub!.cancel();
  }

  void reset() {
    _time!.reset();
    events.clear();
  }

  TraceEvent trace(String message, {Map? map}) {
    var event = new TraceEvent.msg(_time!.elapsedMicroseconds, message, map);
    events.add(event);
    return event;
  }
}
