// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:fidl_fuchsia_cobalt/fidl.dart';
import 'package:meta/meta.dart';

import 'logging.dart';

/// Traces the frame rate of an animation.
@Deprecated('Use package:lib.widgets/utils.dart instead')
class FrameRateTracer {
  /// Name of the animation for tracing purposes.
  final String name;

  /// Optional cobalt logger.  If not null the frame rate will be logged as
  /// an observation to cobalt.
  final Logger cobaltLogger;

  DateTime _animationStart = DateTime.now();
  int _frames = 0;
  String _currentTargetName;
  int _currentCobaltMetricId;

  /// Constructor.
  FrameRateTracer({@required this.name, this.cobaltLogger});

  /// Starts tracking an animation.
  void start({String targetName, int cobaltMetricId}) {
    _currentTargetName = targetName;
    _currentCobaltMetricId = cobaltMetricId;
    _animationStart = DateTime.now();
    _frames = 0;
  }

  /// Must be called per tick of the animation.
  void tick() {
    _frames++;
  }

  /// Must be called when the animation is done.  This emits the trace.
  void done() {
    if (_frames == 0) {
      return;
    }
    int microSeconds =
        DateTime.now().difference(_animationStart).inMicroseconds;
    double frameRate = _frames.toDouble() * 1000000.0 / microSeconds.toDouble();
    String prefix = _currentTargetName?.isEmpty ?? true
        ? '$name'
        : '$name to $_currentTargetName';
    trace(
      '$prefix: ${frameRate.toStringAsPrecision(3)} fps '
          '($_frames/${microSeconds / 1000000.0}s)',
    );
    if (cobaltLogger != null && _currentCobaltMetricId != null) {
      cobaltLogger.logFrameRate(
        _currentCobaltMetricId,
        0,
        '',
        frameRate,
        (Status status) {
          if (status != Status.ok) {
            log.warning(
              'Failed to observe frame rate metric '
                  '$_currentCobaltMetricId: $status. ',
            );
          }
        },
      );
    }
  }
}
