// 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.

#ifndef FLUTTER_SHELL_PLATFORM_FUCHSIA_TESTS_FAKES_TOUCH_SOURCE_H_
#define FLUTTER_SHELL_PLATFORM_FUCHSIA_TESTS_FAKES_TOUCH_SOURCE_H_

#include <fuchsia/ui/pointer/cpp/fidl.h>

#include <optional>
#include <vector>

#include "flutter/fml/logging.h"

namespace flutter_runner::testing {

// A test stub to act as the protocol server. A test can control what is sent
// back by this server implementation, via the ScheduleCallback call.
class FakeTouchSource : public fuchsia::ui::pointer::TouchSource {
 public:
  // |fuchsia.ui.pointer.TouchSource|
  void Watch(std::vector<fuchsia::ui::pointer::TouchResponse> responses,
             TouchSource::WatchCallback callback) override {
    responses_ = std::move(responses);
    callback_ = std::move(callback);
  }

  // Have the server issue events to the client's hanging-get Watch call.
  void ScheduleCallback(std::vector<fuchsia::ui::pointer::TouchEvent> events) {
    FML_CHECK(callback_) << "require a valid WatchCallback";
    callback_(std::move(events));
  }

  // Allow the test to observe what the client uploaded on the next Watch call.
  std::optional<std::vector<fuchsia::ui::pointer::TouchResponse>>
  UploadedResponses() {
    auto responses = std::move(responses_);
    responses_.reset();
    return responses;
  }

 private:
  // |fuchsia.ui.pointer.TouchSource|
  void UpdateResponse(fuchsia::ui::pointer::TouchInteractionId ixn,
                      fuchsia::ui::pointer::TouchResponse response,
                      TouchSource::UpdateResponseCallback callback) override {
    FML_UNREACHABLE();
  }

  // Client uploads responses to server.
  std::optional<std::vector<fuchsia::ui::pointer::TouchResponse>> responses_;

  // Client-side logic to invoke on Watch() call's return. A test triggers it
  // with ScheduleCallback().
  TouchSource::WatchCallback callback_;
};

}  // namespace flutter_runner::testing

#endif  // FLUTTER_SHELL_PLATFORM_FUCHSIA_TESTS_FAKES_TOUCH_SOURCE_H_
