// 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/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart' show collectAllElementsFrom;

import '../common.dart';

const int _kNumIters = 10000;

Future<void> main() async {
  assert(false, "Don't run benchmarks in debug mode! Use 'flutter run --release'.");
  runApp(MaterialApp(
    home: Scaffold(
      body: GridView.count(
        crossAxisCount: 5,
        children: List<Widget>.generate(25, (int index) {
          return Center(
            child: Scaffold(
              appBar: AppBar(
                title: Text('App $index'),
                actions: const <Widget>[
                  Icon(Icons.help),
                  Icon(Icons.add),
                  Icon(Icons.ac_unit),
                ],
              ),
              body: Column(
                children: const <Widget>[
                  Text('Item 1'),
                  Text('Item 2'),
                  Text('Item 3'),
                  Text('Item 4'),
                ],
              ),
            ),
          );
        }),
      ),
    ),
  ));

  // Lists may not be scrolled into frame in landscape.
  SystemChrome.setPreferredOrientations(<DeviceOrientation>[
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]);

  // Wait for frame rendering to stabilize.
  for (int i = 0; i < 5; i++) {
    await SchedulerBinding.instance.endOfFrame;
  }

  final Stopwatch watch = Stopwatch();

  print('flutter_test allElements benchmark... (${WidgetsBinding.instance.renderViewElement})');
  // Make sure we get enough elements to process for consistent benchmark runs
  int elementCount = collectAllElementsFrom(WidgetsBinding.instance.renderViewElement!, skipOffstage: false).length;
  while (elementCount < 2458) {
    await Future<void>.delayed(Duration.zero);
    elementCount = collectAllElementsFrom(WidgetsBinding.instance.renderViewElement!, skipOffstage: false).length;
  }
  print('element count: $elementCount');

  watch.start();
  for (int i = 0; i < _kNumIters; i += 1) {
    final List<Element> allElements = collectAllElementsFrom(
      WidgetsBinding.instance.renderViewElement!,
      skipOffstage: false,
    ).toList();
    allElements.clear();
  }
  watch.stop();

  final BenchmarkResultPrinter printer = BenchmarkResultPrinter();
  printer.addResult(
    description: 'All elements iterate',
    value: watch.elapsedMicroseconds / _kNumIters,
    unit: 'µs per iteration',
    name: 'all_elements_iteration',
  );
  printer.printToStdout();
}
