// 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 the 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: null}) {
    var event = new TraceEvent.msg(_time.elapsedMicroseconds, message, map);
    events.add(event);
    return event;
  }
}
