// 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 'common.dart';
import 'src/animated_advanced_blend.dart';
import 'src/animated_blur_backdrop_filter.dart';
import 'src/animated_complex_image_filtered.dart';
import 'src/animated_complex_opacity.dart';
import 'src/animated_image.dart';
import 'src/animated_placeholder.dart';
import 'src/animation_with_microtasks.dart';
import 'src/backdrop_filter.dart';
import 'src/clipper_cache.dart';
import 'src/color_filter_and_fade.dart';
import 'src/color_filter_cache.dart';
import 'src/color_filter_with_unstable_child.dart';
import 'src/cubic_bezier.dart';
import 'src/cull_opacity.dart';
import 'src/draw_arcs.dart';
import 'src/draw_atlas.dart';
import 'src/draw_points.dart';
import 'src/draw_vertices.dart';
import 'src/filtered_child_animation.dart';
import 'src/fullscreen_textfield.dart';
import 'src/gradient_perf.dart';
import 'src/heavy_grid_view.dart';
import 'src/large_image_changer.dart';
import 'src/large_images.dart';
import 'src/list_text_layout.dart';
import 'src/multi_widget_construction.dart';
import 'src/opacity_peephole.dart';
import 'src/path_tessellation.dart';
import 'src/picture_cache.dart';
import 'src/picture_cache_complexity_scoring.dart';
import 'src/post_backdrop_filter.dart';
import 'src/raster_cache_use_memory.dart';
import 'src/rrect_blur.dart' show RRectBlur;
import 'src/rsuperellipse_blur.dart' show RSuperellipseBlur;
import 'src/shader_mask_cache.dart';
import 'src/simple_animation.dart';
import 'src/simple_scroll.dart';
import 'src/sliders.dart';
import 'src/text.dart';
import 'src/text_shadow_perf.dart';
import 'src/very_long_picture_scrolling.dart';

const String kMacrobenchmarks = 'Macrobenchmarks';

void main() => runApp(const MacrobenchmarksApp());

class MacrobenchmarksApp extends StatelessWidget {
  const MacrobenchmarksApp({super.key, this.initialRoute = '/'});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: kMacrobenchmarks,
      initialRoute: initialRoute,
      routes: <String, WidgetBuilder>{
        '/': (BuildContext context) => const HomePage(),
        kCullOpacityRouteName: (BuildContext context) => const CullOpacityPage(),
        kCubicBezierRouteName: (BuildContext context) => const CubicBezierPage(),
        kBackdropFilterRouteName: (BuildContext context) => const BackdropFilterPage(),
        kPostBackdropFilterRouteName: (BuildContext context) => const PostBackdropFilterPage(),
        kSimpleAnimationRouteName: (BuildContext context) => const SimpleAnimationPage(),
        kPictureCacheRouteName: (BuildContext context) => const PictureCachePage(),
        kPictureCacheComplexityScoringRouteName: (BuildContext context) =>
            const PictureCacheComplexityScoringPage(),
        kLargeImageChangerRouteName: (BuildContext context) => const LargeImageChangerPage(),
        kLargeImagesRouteName: (BuildContext context) => const LargeImagesPage(),
        kTextRouteName: (BuildContext context) => const TextPage(),
        kPathTessellationRouteName: (BuildContext context) =>
            const PathTessellationPage(paintStyle: PaintingStyle.fill),
        kPathStrokeTessellationRouteName: (BuildContext context) =>
            const PathTessellationPage(paintStyle: PaintingStyle.stroke),
        kFullscreenTextRouteName: (BuildContext context) => const TextFieldPage(),
        kAnimatedPlaceholderRouteName: (BuildContext context) => const AnimatedPlaceholderPage(),
        kClipperCacheRouteName: (BuildContext context) => const ClipperCachePage(),
        kColorFilterAndFadeRouteName: (BuildContext context) => const ColorFilterAndFadePage(),
        kColorFilterCacheRouteName: (BuildContext context) => const ColorFilterCachePage(),
        kColorFilterWithUnstableChildName: (BuildContext context) =>
            const ColorFilterWithUnstableChildPage(),
        kFadingChildAnimationRouteName: (BuildContext context) =>
            const FilteredChildAnimationPage(FilterType.opacity),
        kImageFilteredTransformAnimationRouteName: (BuildContext context) =>
            const FilteredChildAnimationPage(FilterType.rotateFilter),
        kMultiWidgetConstructionRouteName: (BuildContext context) =>
            const MultiWidgetConstructTable(10, 20),
        kHeavyGridViewRouteName: (BuildContext context) => const HeavyGridViewPage(),
        kRasterCacheUseMemory: (BuildContext context) => const RasterCacheUseMemory(),
        kShaderMaskCacheRouteName: (BuildContext context) => const ShaderMaskCachePage(),
        kSimpleScrollRouteName: (BuildContext context) => const SimpleScroll(),
        kAnimationWithMicrotasksRouteName: (BuildContext context) =>
            const AnimationWithMicrotasks(),
        kAnimatedImageRouteName: (BuildContext context) => const AnimatedImagePage(),
        kOpacityPeepholeRouteName: (BuildContext context) => const OpacityPeepholePage(),
        ...opacityPeepholeRoutes,
        kGradientPerfRouteName: (BuildContext context) => const GradientPerfHomePage(),
        ...gradientPerfRoutes,
        kAnimatedComplexOpacityPerfRouteName: (BuildContext context) =>
            const AnimatedComplexOpacity(),
        kListTextLayoutRouteName: (BuildContext context) => const ColumnOfText(),
        kAnimatedComplexImageFilteredPerfRouteName: (BuildContext context) =>
            const AnimatedComplexImageFiltered(),
        kAnimatedBlurBackdropFilter: (BuildContext context) => const AnimatedBlurBackdropFilter(),
        kSlidersRouteName: (BuildContext context) => const SlidersPage(),
        kDrawPointsPageRougeName: (BuildContext context) => const DrawPointsPage(),
        kDrawVerticesPageRouteName: (BuildContext context) => const DrawVerticesPage(),
        kDrawAtlasPageRouteName: (BuildContext context) => const DrawAtlasPage(),
        kAnimatedAdvancedBlend: (BuildContext context) => const AnimatedAdvancedBlend(),
        kRRectBlurRouteName: (BuildContext context) => const RRectBlur(),
        kRSuperellipseBlurRouteName: (BuildContext context) => const RSuperellipseBlur(),
        kVeryLongPictureScrollingRouteName: (BuildContext context) =>
            const VeryLongPictureScrollingPerf(),
        kDrawArcsAllFillStylesPageRouteName: (BuildContext context) =>
            const DrawArcsPage(paintStyle: PaintingStyle.fill),
        kDrawArcsAllStrokeStylesPageRouteName: (BuildContext context) =>
            const DrawArcsPage(paintStyle: PaintingStyle.stroke),
        kTextShadowPerfRouteName: (BuildContext context) => const TextShadowPerfPage(),
      },
    );
  }

  final String initialRoute;
}

class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text(kMacrobenchmarks)),
      body: ListView(
        key: const Key(kScrollableName),
        children: <Widget>[
          ElevatedButton(
            key: const Key(kCullOpacityRouteName),
            child: const Text('Cull opacity'),
            onPressed: () {
              Navigator.pushNamed(context, kCullOpacityRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kCubicBezierRouteName),
            child: const Text('Cubic Bezier'),
            onPressed: () {
              Navigator.pushNamed(context, kCubicBezierRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kBackdropFilterRouteName),
            child: const Text('Backdrop Filter'),
            onPressed: () {
              Navigator.pushNamed(context, kBackdropFilterRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kPostBackdropFilterRouteName),
            child: const Text('Post Backdrop Filter'),
            onPressed: () {
              Navigator.pushNamed(context, kPostBackdropFilterRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kSimpleAnimationRouteName),
            child: const Text('Simple Animation'),
            onPressed: () {
              Navigator.pushNamed(context, kSimpleAnimationRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kPictureCacheRouteName),
            child: const Text('Picture Cache'),
            onPressed: () {
              Navigator.pushNamed(context, kPictureCacheRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kPictureCacheComplexityScoringRouteName),
            child: const Text('Picture Cache Complexity Scoring'),
            onPressed: () {
              Navigator.pushNamed(context, kPictureCacheComplexityScoringRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kLargeImagesRouteName),
            child: const Text('Large Images'),
            onPressed: () {
              Navigator.pushNamed(context, kLargeImagesRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kPathTessellationRouteName),
            child: const Text('Path Tessellation'),
            onPressed: () {
              Navigator.pushNamed(context, kPathTessellationRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kPathStrokeTessellationRouteName),
            child: const Text('Path Stroke Tessellation'),
            onPressed: () {
              Navigator.pushNamed(context, kPathStrokeTessellationRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kTextRouteName),
            child: const Text('Text'),
            onPressed: () {
              Navigator.pushNamed(context, kTextRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kFullscreenTextRouteName),
            child: const Text('Fullscreen Text'),
            onPressed: () {
              Navigator.pushNamed(context, kFullscreenTextRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kAnimatedPlaceholderRouteName),
            child: const Text('Animated Placeholder'),
            onPressed: () {
              Navigator.pushNamed(context, kAnimatedPlaceholderRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kClipperCacheRouteName),
            child: const Text('Clipper Cache'),
            onPressed: () {
              Navigator.pushNamed(context, kClipperCacheRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kColorFilterAndFadeRouteName),
            child: const Text('Color Filter and Fade'),
            onPressed: () {
              Navigator.pushNamed(context, kColorFilterAndFadeRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kColorFilterCacheRouteName),
            child: const Text('Color Filter Cache'),
            onPressed: () {
              Navigator.pushNamed(context, kColorFilterCacheRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kColorFilterWithUnstableChildName),
            child: const Text('Color Filter with Unstable Child'),
            onPressed: () {
              Navigator.pushNamed(context, kColorFilterWithUnstableChildName);
            },
          ),
          ElevatedButton(
            key: const Key(kRasterCacheUseMemory),
            child: const Text('RasterCache Use Memory'),
            onPressed: () {
              Navigator.pushNamed(context, kRasterCacheUseMemory);
            },
          ),
          ElevatedButton(
            key: const Key(kShaderMaskCacheRouteName),
            child: const Text('Shader Mask Cache'),
            onPressed: () {
              Navigator.pushNamed(context, kShaderMaskCacheRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kFadingChildAnimationRouteName),
            child: const Text('Fading Child Animation'),
            onPressed: () {
              Navigator.pushNamed(context, kFadingChildAnimationRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kImageFilteredTransformAnimationRouteName),
            child: const Text('ImageFiltered Transform Animation'),
            onPressed: () {
              Navigator.pushNamed(context, kImageFilteredTransformAnimationRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kMultiWidgetConstructionRouteName),
            child: const Text('Widget Construction and Destruction'),
            onPressed: () {
              Navigator.pushNamed(context, kMultiWidgetConstructionRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kHeavyGridViewRouteName),
            child: const Text('Heavy Grid View'),
            onPressed: () {
              Navigator.pushNamed(context, kHeavyGridViewRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kLargeImageChangerRouteName),
            child: const Text('Large Image Changer'),
            onPressed: () {
              Navigator.pushNamed(context, kLargeImageChangerRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kAnimationWithMicrotasksRouteName),
            child: const Text('Animation With Microtasks'),
            onPressed: () {
              Navigator.pushNamed(context, kAnimationWithMicrotasksRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kAnimatedImageRouteName),
            child: const Text('Animated Image'),
            onPressed: () {
              Navigator.pushNamed(context, kAnimatedImageRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kOpacityPeepholeRouteName),
            child: const Text('Opacity Peephole tests'),
            onPressed: () {
              Navigator.pushNamed(context, kOpacityPeepholeRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kGradientPerfRouteName),
            child: const Text('Gradient performance tests'),
            onPressed: () {
              Navigator.pushNamed(context, kGradientPerfRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kAnimatedComplexOpacityPerfRouteName),
            child: const Text('Animated complex opacity perf'),
            onPressed: () {
              Navigator.pushNamed(context, kAnimatedComplexOpacityPerfRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kAnimatedComplexImageFilteredPerfRouteName),
            child: const Text('Animated complex image filtered perf'),
            onPressed: () {
              Navigator.pushNamed(context, kAnimatedComplexImageFilteredPerfRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kListTextLayoutRouteName),
            child: const Text('A list with lots of text'),
            onPressed: () {
              Navigator.pushNamed(context, kListTextLayoutRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kAnimatedBlurBackdropFilter),
            child: const Text('An animating backdrop filter'),
            onPressed: () {
              Navigator.pushNamed(context, kAnimatedBlurBackdropFilter);
            },
          ),
          ElevatedButton(
            key: const Key(kSlidersRouteName),
            child: const Text('Sliders'),
            onPressed: () {
              Navigator.pushNamed(context, kSlidersRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kDrawPointsPageRougeName),
            child: const Text('Draw Points'),
            onPressed: () {
              Navigator.pushNamed(context, kDrawPointsPageRougeName);
            },
          ),
          ElevatedButton(
            key: const Key(kDrawVerticesPageRouteName),
            child: const Text('Draw Vertices'),
            onPressed: () {
              Navigator.pushNamed(context, kDrawVerticesPageRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kDrawAtlasPageRouteName),
            child: const Text('Draw Atlas'),
            onPressed: () {
              Navigator.pushNamed(context, kDrawAtlasPageRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kAnimatedAdvancedBlend),
            child: const Text('Animated Advanced Blend'),
            onPressed: () {
              Navigator.pushNamed(context, kAnimatedAdvancedBlend);
            },
          ),
          ElevatedButton(
            key: const Key(kRRectBlurRouteName),
            child: const Text('Rounded Rect Blur'),
            onPressed: () {
              Navigator.pushNamed(context, kRRectBlurRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kRSuperellipseBlurRouteName),
            child: const Text('Rounded superellipse Blur'),
            onPressed: () {
              Navigator.pushNamed(context, kRSuperellipseBlurRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kVeryLongPictureScrollingRouteName),
            child: const Text('Very Long Picture Scrolling'),
            onPressed: () {
              Navigator.pushNamed(context, kVeryLongPictureScrollingRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kDrawArcsAllFillStylesPageRouteName),
            child: const Text('Draw Fill Style Arcs'),
            onPressed: () {
              Navigator.pushNamed(context, kDrawArcsAllFillStylesPageRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kDrawArcsAllStrokeStylesPageRouteName),
            child: const Text('Draw Stroke Style Arcs'),
            onPressed: () {
              Navigator.pushNamed(context, kDrawArcsAllStrokeStylesPageRouteName);
            },
          ),
          ElevatedButton(
            key: const Key(kTextShadowPerfRouteName),
            child: const Text('Text Shadow Performance'),
            onPressed: () {
              Navigator.pushNamed(context, kTextShadowPerfRouteName);
            },
          ),
        ],
      ),
    );
  }
}
