// 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_MEDIA_PERCEPTION_IMPL_H_
#define MEDIA_PERCEPTION_MEDIA_PERCEPTION_IMPL_H_

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

#include <mojo/public/cpp/bindings/pending_receiver.h>
#include <mojo/public/cpp/bindings/receiver.h>

#include "media_perception/chrome_audio_service_client.h"
#include "media_perception/output_manager.h"
#include "media_perception/rtanalytics.h"
#include "media_perception/video_capture_service_client.h"
#include "mojom/media_perception.mojom.h"

namespace mri {

class MediaPerceptionImpl
    : public chromeos::media_perception::mojom::MediaPerception {
 public:
  MediaPerceptionImpl(
      mojo::PendingReceiver<chromeos::media_perception::mojom::MediaPerception>
          receiver,
      std::shared_ptr<VideoCaptureServiceClient> vidcap_client,
      std::shared_ptr<ChromeAudioServiceClient> cras_client,
      std::shared_ptr<Rtanalytics> rtanalytics);
  MediaPerceptionImpl(const MediaPerceptionImpl&) = delete;
  MediaPerceptionImpl& operator=(const MediaPerceptionImpl&) = delete;

  // chromeos::media_perception::mojom::MediaPerception:
  void SetupConfiguration(const std::string& configuration_name,
                          SetupConfigurationCallback callback) override;
  void SetTemplateArguments(
      const std::string& configuration_name,
      const std::vector<uint8_t>& serialized_arguments_proto,
      SetTemplateArgumentsCallback callback) override;
  void GetVideoDevices(GetVideoDevicesCallback callback) override;
  void GetAudioDevices(GetAudioDevicesCallback callback) override;
  void GetTemplateDevices(const std::string& configuration_name,
                          GetTemplateDevicesCallback callback) override;
  void SetVideoDeviceForTemplateName(
      const std::string& configuration_name,
      const std::string& template_name,
      chromeos::media_perception::mojom::VideoDevicePtr device,
      SetVideoDeviceForTemplateNameCallback callback) override;
  void SetAudioDeviceForTemplateName(
      const std::string& configuration_name,
      const std::string& template_name,
      chromeos::media_perception::mojom::AudioDevicePtr device,
      SetAudioDeviceForTemplateNameCallback callback) override;
  void SetVirtualVideoDeviceForTemplateName(
      const std::string& configuration_name,
      const std::string& template_name,
      chromeos::media_perception::mojom::VirtualVideoDevicePtr device,
      SetVirtualVideoDeviceForTemplateNameCallback callback) override;
  void GetPipelineState(const std::string& configuration_name,
                        GetPipelineStateCallback callback) override;
  void SetPipelineState(
      const std::string& configuration_name,
      chromeos::media_perception::mojom::PipelineStatePtr desired_state,
      SetPipelineStateCallback callback) override;
  void GetGlobalPipelineState(GetGlobalPipelineStateCallback callback) override;

  void set_connection_error_handler(base::Closure connection_error_handler);

 private:
  mojo::Receiver<chromeos::media_perception::mojom::MediaPerception> receiver_;

  std::map<std::string /* configuration_name */, std::unique_ptr<OutputManager>>
      configuration_name_to_output_manager_map_;

  std::shared_ptr<VideoCaptureServiceClient> vidcap_client_;

  std::shared_ptr<ChromeAudioServiceClient> cras_client_;

  std::shared_ptr<Rtanalytics> rtanalytics_;
};

}  // namespace mri

#endif  // MEDIA_PERCEPTION_MEDIA_PERCEPTION_IMPL_H_
