// Copyright 2014 The Flutter 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 'percentile_utils.dart';
import 'timeline.dart';

/// Key for RasterCache timeline events.
const String kRasterCacheEvent = 'RasterCache';

const String _kLayerCount = 'LayerCount';
const String _kLayerMemory = 'LayerMBytes';
const String _kPictureCount = 'PictureCount';
const String _kPictureMemory = 'PictureMBytes';

/// Summarizes [TimelineEvents]s corresponding to [kRasterCacheEvent] events.
///
/// A sample event (some fields have been omitted for brevity):
/// ```
///     {
///       "name": "RasterCache",
///       "ts": 75598996256,
///       "ph": "C",
///       "args": {
///         "LayerCount": "1",
///         "LayerMBytes": "0.336491",
///         "PictureCount": "0",
///         "PictureMBytes": "0.000000",
///       }
///     },
/// ```
class RasterCacheSummarizer {
  /// Creates a RasterCacheSummarizer given the timeline events.
  RasterCacheSummarizer(this.rasterCacheEvents) {
    for (final TimelineEvent event in rasterCacheEvents) {
      assert(event.name == kRasterCacheEvent);
    }
  }

  /// The raster cache events.
  final List<TimelineEvent> rasterCacheEvents;

  late final List<double> _layerCounts = _extractValues(_kLayerCount);
  late final List<double> _layerMemories = _extractValues(_kLayerMemory);
  late final List<double> _pictureCounts = _extractValues(_kPictureCount);
  late final List<double> _pictureMemories = _extractValues(_kPictureMemory);

  /// Computes the average of the `LayerCount` values over the cache events.
  double computeAverageLayerCount() => _computeAverage(_layerCounts);

  /// Computes the average of the `LayerMemory` values over the cache events.
  double computeAverageLayerMemory() => _computeAverage(_layerMemories);

  /// Computes the average of the `PictureCount` values over the cache events.
  double computeAveragePictureCount() => _computeAverage(_pictureCounts);

  /// Computes the average of the `PictureMemory` values over the cache events.
  double computeAveragePictureMemory() => _computeAverage(_pictureMemories);

  /// The [percentile]-th percentile `LayerCount` over the cache events.
  double computePercentileLayerCount(double percentile) => _computePercentile(_layerCounts, percentile);

  /// The [percentile]-th percentile `LayerMemory` over the cache events.
  double computePercentileLayerMemory(double percentile) => _computePercentile(_layerMemories, percentile);

  /// The [percentile]-th percentile `PictureCount` over the cache events.
  double computePercentilePictureCount(double percentile) => _computePercentile(_pictureCounts, percentile);

  /// The [percentile]-th percentile `PictureMemory` over the cache events.
  double computePercentilePictureMemory(double percentile) => _computePercentile(_pictureMemories, percentile);

  /// Computes the worst of the `LayerCount` values over the cache events.
  double computeWorstLayerCount() => _computeWorst(_layerCounts);

  /// Computes the worst of the `LayerMemory` values over the cache events.
  double computeWorstLayerMemory() => _computeWorst(_layerMemories);

  /// Computes the worst of the `PictureCount` values over the cache events.
  double computeWorstPictureCount() => _computeWorst(_pictureCounts);

  /// Computes the worst of the `PictureMemory` values over the cache events.
  double computeWorstPictureMemory() => _computeWorst(_pictureMemories);

  static double _computeAverage(List<double> values) {
    if (values.isEmpty) {
      return 0;
    }

    final double total = values.reduce((double a, double b) => a + b);
    return total / values.length;
  }

  static double _computePercentile(List<double> values, double percentile) {
    if (values.isEmpty) {
      return 0;
    }

    return findPercentile(values, percentile);
  }

  static double _computeWorst(List<double> values) {
    if (values.isEmpty) {
      return 0;
    }

    values.sort();
    return values.last;
  }

  List<double> _extractValues(String name) =>
      rasterCacheEvents.map((TimelineEvent e) => _getValue(e, name)).toList();

  double _getValue(TimelineEvent e, String name) {
    assert(e.name == kRasterCacheEvent);
    assert(e.arguments!.containsKey(name));
    final dynamic valueString = e.arguments![name];
    assert(valueString is String);
    return double.parse(valueString as String);
  }
}
