// 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 'package:flutter/gestures.dart';

import '../common.dart';
import 'data/velocity_tracker_data.dart';

const int _kNumIters = 10000;

class TrackerBenchmark {
  TrackerBenchmark({required this.name, required this.tracker });

  final VelocityTracker tracker;
  final String name;
}

void main() {
  assert(false, "Don't run benchmarks in debug mode! Use 'flutter run --release'.");
  final BenchmarkResultPrinter printer = BenchmarkResultPrinter();
  final List<TrackerBenchmark> benchmarks = <TrackerBenchmark>[
    TrackerBenchmark(name: 'velocity_tracker_iteration', tracker: VelocityTracker.withKind(PointerDeviceKind.touch)),
    TrackerBenchmark(name: 'velocity_tracker_iteration_ios_fling', tracker: IOSScrollViewFlingVelocityTracker(PointerDeviceKind.touch)),
  ];
  final Stopwatch watch = Stopwatch();

  for (final TrackerBenchmark benchmark in benchmarks) {
    print('${benchmark.name} benchmark...');
    final VelocityTracker tracker = benchmark.tracker;
    watch.reset();
    watch.start();
    for (int i = 0; i < _kNumIters; i += 1) {
      for (final PointerEvent event in velocityEventData) {
        if (event is PointerDownEvent || event is PointerMoveEvent) {
          tracker.addPosition(event.timeStamp, event.position);
        }
        if (event is PointerUpEvent) {
          tracker.getVelocity();
        }
      }
    }
    watch.stop();
    printer.addResult(
      description: 'Velocity tracker: ${tracker.runtimeType}',
      value: watch.elapsedMicroseconds / _kNumIters,
      unit: 'µs per iteration',
      name: benchmark.name,
    );
  }

  printer.printToStdout();
}
