// 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:web_benchmarks/client.dart';

import 'gallery_automator.dart';

/// A recorder that measures frame building durations for the Gallery.
class GalleryRecorder extends WidgetRecorder {
  GalleryRecorder({
    required this.benchmarkName,
    this.shouldRunPredicate,
    this.testScrollingOnly = false,
  })  : assert(testScrollingOnly || shouldRunPredicate != null),
        super(name: benchmarkName, useCustomWarmUp: true);

  /// The name of the gallery benchmark to be run.
  ///
  /// See `common.dart` for the list of the names of all benchmarks.
  final String benchmarkName;

  /// A function that accepts the name of a demo and returns whether we should
  /// run this demo in this benchmark.
  ///
  /// See `common.dart` for examples.
  ///
  /// The name of any demo has the format `<demo-name>@<demo-type>`, such as
  /// `progress-indicator@material`.
  /// A list of all demo names can be obtained using
  /// [allGalleryDemoDescriptions].
  final bool Function(String)? shouldRunPredicate;

  /// Whether this benchmark only tests scrolling.
  final bool testScrollingOnly;

  GalleryAutomator? _galleryAutomator;
  bool get _finished => _galleryAutomator?.finished ?? false;

  /// Whether we should continue recording.
  @override
  bool shouldContinue() => !_finished || profile.shouldContinue();

  /// Creates the [GalleryAutomator] widget.
  @override
  Widget createWidget() {
    _galleryAutomator = GalleryAutomator(
      benchmarkName: benchmarkName,
      shouldRunPredicate: shouldRunPredicate,
      testScrollsOnly: testScrollingOnly,
      stopWarmingUpCallback: profile.stopWarmingUp,
    );
    return _galleryAutomator!.createWidget();
  }
}
