// Copyright 2013 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 'dart:ui';

import 'channel_util.dart';
import 'scenario.dart';

/// Tries to draw darwin system font: CupertinoSystemDisplay, CupertinoSystemText
class DarwinSystemFont extends Scenario {
  /// Creates the DarwinSystemFont scenario.
  DarwinSystemFont(super.view);

  // Semi-arbitrary.
  final double _screenWidth = 700;

  @override
  void onBeginFrame(Duration duration) {
    final SceneBuilder builder = SceneBuilder();
    final PictureRecorder recorder = PictureRecorder();
    final Canvas canvas = Canvas(recorder);

    final ParagraphBuilder paragraphBuilderDisplay =
        ParagraphBuilder(ParagraphStyle(fontFamily: 'CupertinoSystemDisplay'))
          ..pushStyle(TextStyle(fontSize: 50))
          ..addText('Cupertino System Display\n')
          ..pop();
    final ParagraphBuilder paragraphBuilderText =
        ParagraphBuilder(ParagraphStyle(fontFamily: 'CupertinoSystemText'))
          ..pushStyle(TextStyle(fontSize: 50))
          ..addText('Cupertino System Text\n')
          ..pop();

    final Paragraph paragraphPro = paragraphBuilderDisplay.build();
    paragraphPro.layout(ParagraphConstraints(width: _screenWidth));
    canvas.drawParagraph(paragraphPro, const Offset(50, 80));

    final Paragraph paragraphText = paragraphBuilderText.build();
    paragraphText.layout(ParagraphConstraints(width: _screenWidth));
    canvas.drawParagraph(paragraphText, const Offset(50, 200));

    final Picture picture = recorder.endRecording();

    builder.addPicture(
      Offset.zero,
      picture,
      willChangeHint: true,
    );
    final Scene scene = builder.build();
    view.render(scene);
    scene.dispose();

    sendJsonMessage(
      dispatcher: view.platformDispatcher,
      channel: 'display_data',
      json: <String, dynamic>{
        'data': 'ready',
      },
    );
  }
}
