// 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 fit::result<std::unique_ptr<VirtualCamera>, zx_status_t> Create(
      fidl::InterfaceHandle<fuchsia::sysmem::Allocator> allocator);
  fidl::InterfaceRequestHandler<fuchsia::camera3::Device> GetHandler() override;
  fit::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::sysmem::BufferCollectionToken> token);
  void FrameTick();
  void FillFrame(uint32_t buffer_index);
  void EmbedMetadata(const fuchsia::camera3::FrameInfo& info);

  async::Loop loop_;
  fuchsia::sysmem::AllocatorPtr allocator_;
  std::unique_ptr<FakeCamera> camera_;
  std::shared_ptr<FakeStream> stream_;
  std::optional<fuchsia::sysmem::BufferCollectionInfo_2> 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_
