// 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_MEDIA_CODEC_EXAMPLES_ENCODE_CAMERA_CAMERA_CLIENT_H_
#define SRC_MEDIA_CODEC_EXAMPLES_ENCODE_CAMERA_CAMERA_CLIENT_H_

#include <fuchsia/camera3/cpp/fidl.h>
#include <fuchsia/sysmem/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/fit/function.h>
#include <lib/fit/result.h>

// This class discovers a camera device and connects to the first stream on the first configuration
// and streams buffers to be shown.
class CameraClient {
 public:
  ~CameraClient();
  static fit::result<std::unique_ptr<CameraClient>, zx_status_t> Create(
      fuchsia::camera3::DeviceWatcherHandle watcher, fuchsia::sysmem::AllocatorHandle allocator,
      bool list_configs, uint32_t config_index, uint32_t stream_index);
  using AddCollectionHandler =
      fit::function<uint32_t(fuchsia::sysmem::BufferCollectionTokenHandle,
                             fuchsia::sysmem::ImageFormat_2, fuchsia::camera3::FrameRate)>;
  using RemoveCollectionHandler = fit::function<void(uint32_t)>;
  using ShowBufferHandler = fit::function<void(uint32_t, uint32_t, zx::eventpair)>;
  using MuteStateHandler = fit::function<void(bool)>;
  // Registers handlers that are called when the cycler adds or removes a buffer collection. The
  // value returned by |on_add_collection| will be subsequently passed to |on_remove_collection|.
  void SetHandlers(AddCollectionHandler on_add_collection,
                   RemoveCollectionHandler on_remove_collection, ShowBufferHandler on_show_buffer,
                   MuteStateHandler on_mute_changed);

 private:
  CameraClient(bool list_configs, uint32_t config_index, uint32_t stream_index);
  void WatchDevicesCallback(std::vector<fuchsia::camera3::WatchDevicesEvent> events);
  void WatchMuteStateHandler(bool software_muted, bool hardware_muted);
  void ConnectToStream(uint32_t config_index, uint32_t stream_index);
  void OnNextFrame(uint32_t stream_index, fuchsia::camera3::FrameInfo frame_info);
  void DumpConfigs();

  fuchsia::camera3::DeviceWatcherPtr watcher_;
  fuchsia::sysmem::AllocatorPtr allocator_;
  fuchsia::camera3::DevicePtr device_;
  std::vector<fuchsia::camera3::Configuration> configurations_;
  AddCollectionHandler add_collection_handler_;
  RemoveCollectionHandler remove_collection_handler_;
  ShowBufferHandler show_buffer_handler_;
  MuteStateHandler mute_state_handler_;

  bool list_configs_ = false;
  uint32_t config_index_ = 0;
  uint32_t stream_index_ = 0;

  // stream_infos_ uses the same index as the corresponding stream index in configurations_.
  struct StreamInfo {
    fuchsia::camera3::StreamPtr stream;
    fuchsia::sysmem::BufferCollectionInfo_2 buffer_collection_info;
    uint32_t add_collection_handler_returned_value;
  };
  std::map<uint32_t, StreamInfo> stream_infos_;
};

#endif  // SRC_MEDIA_CODEC_EXAMPLES_ENCODE_CAMERA_CAMERA_CLIENT_H_
