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

#include "media_perception/fake_rtanalytics.h"

#include <string>
#include <vector>

#include "media_perception/media_perception_mojom.pb.h"
#include "media_perception/perception_interface.pb.h"
#include "media_perception/proto_mojom_conversion.h"
#include "media_perception/serialized_proto.h"

namespace mri {

void FakeRtanalytics::SetSerializedDeviceTemplates(
    std::vector<SerializedDeviceTemplate> serialized_device_templates) {
  serialized_device_templates_ = serialized_device_templates;
}

SerializedPerceptionInterfaces FakeRtanalytics::SetupConfiguration(
    const std::string& configuration_name,
    SerializedSuccessStatus* success_status) {
  SuccessStatus status;
  status.set_success(true);
  status.set_failure_reason(configuration_name);
  *success_status = Serialized<SuccessStatus>(status).GetBytes();
  PerceptionInterfaces perception_interfaces;
  return Serialized<PerceptionInterfaces>(perception_interfaces).GetBytes();
}

SerializedSuccessStatus FakeRtanalytics::SetTemplateArguments(
    const std::string& configuration_name,
    const SerializedTemplateArguments& serialized_arguments) {
  SuccessStatus status;
  status.set_success(true);
  status.set_failure_reason(configuration_name);
  return Serialized<SuccessStatus>(status).GetBytes();
}

std::vector<SerializedDeviceTemplate> FakeRtanalytics::GetTemplateDevices(
    const std::string& configuration_name) const {
  return serialized_device_templates_;
}

SerializedSuccessStatus FakeRtanalytics::SetVideoDeviceForTemplateName(
    const std::string& configuration_name,
    const std::string& template_name,
    const SerializedVideoDevice& video_device) {
  SuccessStatus status;
  status.set_success(true);
  status.set_failure_reason(template_name);
  return Serialized<SuccessStatus>(status).GetBytes();
}

SerializedSuccessStatus FakeRtanalytics::SetAudioDeviceForTemplateName(
    const std::string& configuration_name,
    const std::string& template_name,
    const SerializedAudioDevice& audio_device) {
  SuccessStatus status;
  status.set_success(true);
  status.set_failure_reason(template_name);
  return Serialized<SuccessStatus>(status).GetBytes();
}

SerializedSuccessStatus FakeRtanalytics::SetVirtualVideoDeviceForTemplateName(
    const std::string& configuration_name,
    const std::string& template_name,
    const SerializedVirtualVideoDevice& virtual_device) {
  SuccessStatus status;
  status.set_success(true);
  status.set_failure_reason(template_name);
  return Serialized<SuccessStatus>(status).GetBytes();
}

SerializedPipelineState FakeRtanalytics::GetPipelineState(
    const std::string& configuration_name) const {
  PipelineState pipeline_state;
  pipeline_state.set_status(PipelineStatus::SUSPENDED);
  return Serialized<PipelineState>(pipeline_state).GetBytes();
}

SerializedPipelineState FakeRtanalytics::SetPipelineState(
    const std::string& configuration_name,
    const SerializedPipelineState& desired_state) {
  PipelineState pipeline_state =
      Serialized<PipelineState>(desired_state).Deserialize();
  return Serialized<PipelineState>(pipeline_state).GetBytes();
}

SerializedGlobalPipelineState FakeRtanalytics::GetGlobalPipelineState() const {
  GlobalPipelineState state;
  state.add_states()->set_configuration_name("fake_configuration");
  return Serialized<GlobalPipelineState>(state).GetBytes();
}

SerializedSuccessStatus FakeRtanalytics::SetPipelineOutputHandler(
    const std::string& configuration_name,
    const std::string& output_stream,
    PipelineOutputHandler output_handler) {
  SuccessStatus status;
  status.set_success(true);
  status.set_failure_reason(output_stream);
  most_recent_output_stream_name_ = output_stream;
  return Serialized<SuccessStatus>(status).GetBytes();
}

}  // namespace mri
