// Copyright 2020 The Fuchsia 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 SRC_CAMERA_LIB_FAKE_STREAM_FAKE_STREAM_IMPL_H_
#define SRC_CAMERA_LIB_FAKE_STREAM_FAKE_STREAM_IMPL_H_

#include <lib/async-loop/cpp/loop.h>
#include <lib/fidl/cpp/binding_set.h>

#include <queue>

#include "src/camera/lib/fake_stream/fake_stream.h"

namespace camera {

class FakeCameraImpl;

// Implements the FakeStream interface. Unless otherwise noted, all public methods are thread-safe,
// and all private methods must be called on the loop's thread.
class FakeStreamImpl : public FakeStream, public fuchsia::camera3::Stream {
 public:
  FakeStreamImpl();
  ~FakeStreamImpl() override;
  static fit::result<std::unique_ptr<FakeStreamImpl>, zx_status_t> Create(
      fuchsia::camera3::StreamProperties properties,
      fit::function<void(fidl::InterfaceHandle<fuchsia::sysmem::BufferCollectionToken>)>
          on_set_buffer_collection);
  fidl::InterfaceRequestHandler<fuchsia::camera3::Stream> GetHandler() override;
  void AddFrame(fuchsia::camera3::FrameInfo info) override;

 private:
  void OnNewRequest(fidl::InterfaceRequest<fuchsia::camera3::Stream> request);
  void OnDestruction();

  // |fuchsia::camera3::Stream|
  void SetCropRegion(std::unique_ptr<fuchsia::math::RectF> region) override;
  void WatchCropRegion(WatchCropRegionCallback callback) override;
  void SetResolution(fuchsia::math::Size coded_size) override;
  void WatchResolution(WatchResolutionCallback callback) override;
  void SetBufferCollection(
      fidl::InterfaceHandle<fuchsia::sysmem::BufferCollectionToken> token) override;
  void WatchBufferCollection(WatchBufferCollectionCallback callback) override;
  void WatchOrientation(WatchOrientationCallback callback) override;
  void GetNextFrame(GetNextFrameCallback callback) override;
  void Rebind(fidl::InterfaceRequest<Stream> request) override;

  async::Loop loop_;
  fidl::BindingSet<fuchsia::camera3::Stream> bindings_;
  fuchsia::camera3::StreamProperties properties_;
  fit::function<void(fidl::InterfaceHandle<fuchsia::sysmem::BufferCollectionToken>)>
      on_set_buffer_collection_;
  fidl::InterfaceHandle<fuchsia::sysmem::BufferCollectionToken> token_;
  WatchBufferCollectionCallback token_request_;
  std::queue<fuchsia::camera3::FrameInfo> frames_;
  GetNextFrameCallback frame_request_;

  friend class FakeCameraImpl;
};

}  // namespace camera

#endif  // SRC_CAMERA_LIB_FAKE_STREAM_FAKE_STREAM_IMPL_H_
