// 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/rendering.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_test/flutter_test.dart';

import 'common.dart';

final Set<String> interestingLabels = <String>{
  'BUILD',
  'LAYOUT',
  'UPDATING COMPOSITING BITS',
  'PAINT',
  'COMPOSITING',
  'FINALIZE TREE',
  '$Placeholder',
  '$CustomPaint',
  '$RenderCustomPaint',
};

class TestRoot extends StatefulWidget {
  const TestRoot({ super.key });

  static late final TestRootState state;

  @override
  State<TestRoot> createState() => TestRootState();
}

class TestRootState extends State<TestRoot> {
  @override
  void initState() {
    super.initState();
    TestRoot.state = this;
  }

  Widget _widget = const Placeholder();

  void updateWidget(Widget newWidget) {
    setState(() {
      _widget = newWidget;
    });
  }

  void rebuild() {
    setState(() {
      // no change, just force a rebuild
    });
  }

  @override
  Widget build(BuildContext context) {
    return _widget;
  }
}

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  initTimelineTests();
  test('Timeline', () async {
    // We don't have expectations around the first frame because there's a race around
    // the warm-up frame that we don't want to get involved in here.
    await runFrame(() { runApp(const TestRoot()); });
    await SchedulerBinding.instance.endOfFrame;
    await fetchInterestingEvents(interestingLabels);

    // The next few cases build the exact same tree so should have no effect.

    debugProfileBuildsEnabled = true;
    await runFrame(() { TestRoot.state.rebuild(); });
    expect(
      await fetchInterestingEventNames(interestingLabels),
      <String>['BUILD', 'LAYOUT', 'UPDATING COMPOSITING BITS', 'PAINT', 'COMPOSITING', 'FINALIZE TREE'],
    );
    debugProfileBuildsEnabled = false;

    debugProfileLayoutsEnabled = true;
    await runFrame(() { TestRoot.state.rebuild(); });
    expect(
      await fetchInterestingEventNames(interestingLabels),
      <String>['BUILD', 'LAYOUT', 'UPDATING COMPOSITING BITS', 'PAINT', 'COMPOSITING', 'FINALIZE TREE'],
    );
    debugProfileLayoutsEnabled = false;

    debugProfilePaintsEnabled = true;
    await runFrame(() { TestRoot.state.rebuild(); });
    expect(
      await fetchInterestingEventNames(interestingLabels),
      <String>['BUILD', 'LAYOUT', 'UPDATING COMPOSITING BITS', 'PAINT', 'COMPOSITING', 'FINALIZE TREE'],
    );
    debugProfilePaintsEnabled = false;


    // Now we replace the widgets each time to cause a rebuild.

    List<TimelineEvent> events;
    Map<String, String> args;

    debugProfileBuildsEnabled = true;
    debugEnhanceBuildTimelineArguments = true;
    await runFrame(() { TestRoot.state.updateWidget(Placeholder(key: UniqueKey(), color: const Color(0xFFFFFFFF))); });
    events = await fetchInterestingEvents(interestingLabels);
    expect(
      events.map<String>(eventToName),
      <String>['BUILD', 'Placeholder', 'CustomPaint', 'LAYOUT', 'UPDATING COMPOSITING BITS', 'PAINT', 'COMPOSITING', 'FINALIZE TREE'],
    );
    args = (events.where((TimelineEvent event) => event.json!['name'] == '$Placeholder').single.json!['args'] as Map<String, Object?>).cast<String, String>();
    expect(args['color'], 'Color(0xffffffff)');
    debugProfileBuildsEnabled = false;
    debugEnhanceBuildTimelineArguments = false;

    debugProfileBuildsEnabledUserWidgets = true;
    debugEnhanceBuildTimelineArguments = true;
    await runFrame(() { TestRoot.state.updateWidget(Placeholder(key: UniqueKey(), color: const Color(0xFFFFFFFF))); });
    events = await fetchInterestingEvents(interestingLabels);
    expect(
      events.map<String>(eventToName),
      <String>['BUILD', 'Placeholder', 'LAYOUT', 'UPDATING COMPOSITING BITS', 'PAINT', 'COMPOSITING', 'FINALIZE TREE'],
    );
    args = (events.where((TimelineEvent event) => event.json!['name'] == '$Placeholder').single.json!['args'] as Map<String, Object?>).cast<String, String>();
    expect(args['color'], 'Color(0xffffffff)');
    debugProfileBuildsEnabledUserWidgets = false;
    debugEnhanceBuildTimelineArguments = false;

    debugProfileLayoutsEnabled = true;
    debugEnhanceLayoutTimelineArguments = true;
    await runFrame(() { TestRoot.state.updateWidget(Placeholder(key: UniqueKey())); });
    events = await fetchInterestingEvents(interestingLabels);
    expect(
      events.map<String>(eventToName),
      <String>['BUILD', 'LAYOUT', 'RenderCustomPaint', 'UPDATING COMPOSITING BITS', 'PAINT', 'COMPOSITING', 'FINALIZE TREE'],
    );
    args = (events.where((TimelineEvent event) => event.json!['name'] == '$RenderCustomPaint').single.json!['args'] as Map<String, Object?>).cast<String, String>();
    expect(args['creator'], startsWith('CustomPaint'));
    expect(args['creator'], contains('Placeholder'));
    expect(args['painter'], startsWith('_PlaceholderPainter#'));
    debugProfileLayoutsEnabled = false;
    debugEnhanceLayoutTimelineArguments = false;

    debugProfilePaintsEnabled = true;
    debugEnhancePaintTimelineArguments = true;
    await runFrame(() { TestRoot.state.updateWidget(Placeholder(key: UniqueKey())); });
    events = await fetchInterestingEvents(interestingLabels);
    expect(
      events.map<String>(eventToName),
      <String>['BUILD', 'LAYOUT', 'UPDATING COMPOSITING BITS', 'PAINT', 'RenderCustomPaint', 'COMPOSITING', 'FINALIZE TREE'],
    );
    args = (events.where((TimelineEvent event) => event.json!['name'] == '$RenderCustomPaint').single.json!['args'] as Map<String, Object?>).cast<String, String>();
    expect(args['creator'], startsWith('CustomPaint'));
    expect(args['creator'], contains('Placeholder'));
    expect(args['painter'], startsWith('_PlaceholderPainter#'));
    debugProfilePaintsEnabled = false;
    debugEnhancePaintTimelineArguments = false;

  }, skip: isBrowser); // [intended] uses dart:isolate and io.
}
