// 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/services.dart' show PlatformAssetBundle;
import 'package:flutter/widgets.dart';

import '../common.dart';

const int _kBatchSize = 100;
const int _kNumIterations = 100;

void main() async {
  assert(false,
      "Don't run benchmarks in debug mode! Use 'flutter run --release'.");
  final BenchmarkResultPrinter printer = BenchmarkResultPrinter();
  WidgetsFlutterBinding.ensureInitialized();
  final Stopwatch watch = Stopwatch();
  final PlatformAssetBundle bundle = PlatformAssetBundle();

  final List<double> values = <double>[];
  for (int j = 0; j < _kNumIterations; ++j) {
    double tally = 0;
    watch.reset();
    watch.start();
    for (int i = 0; i < _kBatchSize; i += 1) {
      // Note: We don't load images like this. PlatformAssetBundle is used for
      // other assets (like Rive animations). We are using an image because it's
      // conveniently sized and available for the test.
      tally += (await bundle.load('packages/flutter_gallery_assets/places/india_pondicherry_salt_farm.png')).lengthInBytes;
    }
    watch.stop();
    values.add(watch.elapsedMicroseconds.toDouble() / _kBatchSize);
    if (tally < 0.0) {
      print("This shouldn't happen.");
    }
  }

  printer.addResultStatistics(
    description: 'PlatformAssetBundle.load 1MB',
    values: values,
    unit: 'us per iteration',
    name: 'PlatformAssetBundle_load_1MB',
  );

  printer.printToStdout();
}
