// 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';

/// A scenario that sends back messages when touches are received.
class TouchesScenario extends Scenario {
  /// Constructor for `TouchesScenario`.
  TouchesScenario(super.view);

  final Map<int, int> _knownDevices = <int, int>{};
  int _sequenceNo = 0;

  @override
  void onBeginFrame(Duration duration) {
    // It is necessary to render frames for touch events to work properly on iOS
    final Scene scene = SceneBuilder().build();
    view.render(scene);
    scene.dispose();
  }

  @override
  void onPointerDataPacket(PointerDataPacket packet) {
    for (final PointerData datum in packet.data) {
      final int deviceId =
          _knownDevices.putIfAbsent(datum.device, () => _knownDevices.length);
      sendJsonMessage(
        dispatcher: view.platformDispatcher,
        channel: 'display_data',
        json: <String, dynamic>{
          'data': '$_sequenceNo,${datum.change},device=$deviceId,buttons=${datum.buttons},signalKind=${datum.signalKind}',
        },
      );
      _sequenceNo++;
    }
  }
}
