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

#pragma once

#include <map>

#include "virtual_camera_stream.h"

#include <ddktl/device-internal.h>
#include <ddktl/device.h>
#include <ddktl/protocol/empty-protocol.h>
#include <fuchsia/hardware/camera/c/fidl.h>
#include <fuchsia/camera/common/c/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async/default.h>
#include <lib/async/wait.h>
#include <lib/fidl-utils/bind.h>
#include <lib/fzl/vmo-pool.h>

namespace virtual_camera {

class VirtualCameraDevice;
using VirtualCameraDeviceType = ddk::Device<VirtualCameraDevice, ddk::Unbindable, ddk::Messageable>;

class VirtualCameraDevice : public VirtualCameraDeviceType,
                            public ddk::EmptyProtocol<ZX_PROTOCOL_CAMERA> {
 public:
  DISALLOW_COPY_ASSIGN_AND_MOVE(VirtualCameraDevice);

  static zx_status_t Create(void* ctx, zx_device_t* parent);

  VirtualCameraDevice(zx_device_t* parent) : VirtualCameraDeviceType(parent), count_(0) {}

  ~VirtualCameraDevice() {}

  // DDK device implementation
  void DdkRelease();
  void DdkUnbind();
  zx_status_t DdkMessage(fidl_msg_t* msg, fidl_txn_t* txn);

  void RemoveStream(uint64_t);

 private:
  // DDK Helper Functions.
  zx_status_t GetFormats(uint32_t index, fidl_txn_t* txn);
  zx_status_t CreateStream(const fuchsia_sysmem_BufferCollectionInfo* buffer_collection_info,
                           const fuchsia_camera_common_FrameRate* rate, zx_handle_t stream,
                           zx_handle_t stream_token);
  zx_status_t GetDeviceInfo(fidl_txn_t* txn);

  static constexpr fuchsia_hardware_camera_ControlV2_ops_t control_ops = {
      .GetFormats = fidl::Binder<VirtualCameraDevice>::BindMember<&VirtualCameraDevice::GetFormats>,
      .CreateStream =
          fidl::Binder<VirtualCameraDevice>::BindMember<&VirtualCameraDevice::CreateStream>,
      .GetDeviceInfo =
          fidl::Binder<VirtualCameraDevice>::BindMember<&VirtualCameraDevice::GetDeviceInfo>,
  };

  std::map<uint64_t, fbl::unique_ptr<VirtualCameraStream>> streams_;

  // Variable to keep track of the number of streams created.
  uint64_t count_;
};

}  // namespace virtual_camera
