// 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_VIRTUAL_CAMERA_VIRTUAL_CAMERA_IMPL_H_
#define SRC_CAMERA_LIB_VIRTUAL_CAMERA_VIRTUAL_CAMERA_IMPL_H_

#include <lib/async-loop/cpp/loop.h>
#include <lib/async/cpp/wait.h>
#include <lib/zx/clock.h>

#include <queue>

#include "src/camera/lib/fake_camera/fake_camera.h"
#include "src/camera/lib/virtual_camera/virtual_camera.h"

namespace camera {

class VirtualCameraImpl : public VirtualCamera {
 public:
  VirtualCameraImpl();
  ~VirtualCameraImpl() override;
  static fpromise::result<std::unique_ptr<VirtualCamera>, zx_status_t> Create(
      fidl::InterfaceHandle<fuchsia::sysmem2::Allocator> allocator);
  fidl::InterfaceRequestHandler<fuchsia::camera3::Device> GetHandler() override;
  fpromise::result<void, std::string> CheckFrame(const void* data, size_t size,
                                                 const fuchsia::camera3::FrameInfo& info) override;

 private:
  void OnNewRequest(fidl::InterfaceRequest<fuchsia::camera3::Device> request);
  void OnDestruction();
  void OnSetBufferCollection(fidl::InterfaceHandle<fuchsia::sysmem2::BufferCollectionToken> token);
  void FrameTick();
  void FillFrame(uint32_t buffer_index);
  void EmbedMetadata(const fuchsia::camera3::FrameInfo& info);

  async::Loop loop_;
  fuchsia::sysmem2::AllocatorPtr allocator_;
  std::unique_ptr<FakeCamera> camera_;
  std::shared_ptr<FakeStream> stream_;
  std::optional<fuchsia::sysmem2::BufferCollectionInfo> buffers_;
  zx::time interrupt_start_time_;
  uint64_t frame_count_;
  std::queue<uint32_t> free_buffers_;
  std::map<uint32_t, std::unique_ptr<async::Wait>> frame_waiters_;
};

}  // namespace camera

#endif  // SRC_CAMERA_LIB_VIRTUAL_CAMERA_VIRTUAL_CAMERA_IMPL_H_
