// Copyright 2018 The Chromium OS 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 MEDIA_PERCEPTION_FAKE_VIDEO_CAPTURE_SERVICE_CLIENT_H_
#define MEDIA_PERCEPTION_FAKE_VIDEO_CAPTURE_SERVICE_CLIENT_H_

#include <memory>
#include <string>
#include <vector>

#include "base/macros.h"
#include "media_perception/video_capture_service_client.h"

namespace mri {

class FakeVideoCaptureServiceClient : public VideoCaptureServiceClient {
 public:
  FakeVideoCaptureServiceClient() = default;

  void SetDevicesForGetDevices(std::vector<SerializedVideoDevice> devices);

  // VideoCaptureServiceClient:
  bool Connect() override;
  bool IsConnected() override;
  void GetDevices(const GetDevicesCallback& callback) override;
  void OpenDevice(const std::string& device_id,
                  bool force_reopen_with_settings,
                  const SerializedVideoStreamParams& capture_format,
                  const OpenDeviceCallback& callback) override;
  bool IsVideoCaptureStartedForDevice(
      const std::string& device_id,
      SerializedVideoStreamParams* capture_format) override;
  int AddFrameHandler(const std::string& device_id,
                      FrameHandler handler) override;
  bool RemoveFrameHandler(const std::string& device_id,
                          int frame_handler_id) override;
  void CreateVirtualDevice(const SerializedVideoDevice& video_device,
                           const VirtualDeviceCallback& callback) override;
  void PushFrameToVirtualDevice(const std::string& device_id,
                                uint64_t timestamp_in_microseconds,
                                std::unique_ptr<const uint8_t[]> data,
                                int data_size,
                                RawPixelFormat pixel_format,
                                int frame_width,
                                int frame_height) override;
  void CloseVirtualDevice(const std::string& device_id) override;

 private:
  std::vector<SerializedVideoDevice> devices_;
  bool connected_;

  DISALLOW_COPY_AND_ASSIGN(FakeVideoCaptureServiceClient);
};

}  // namespace mri

#endif  // MEDIA_PERCEPTION_FAKE_VIDEO_CAPTURE_SERVICE_CLIENT_H_
