// 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/media_perception_service_impl.h"

#include <base/bind.h>
#include <base/logging.h>
#include <utility>

#include "media_perception/media_perception_controller_impl.h"

namespace mri {

namespace {

void OnConnectionClosedOrError(
    const MediaPerceptionControllerImpl* const controller) {
  LOG(WARNING) << "Got closed connection.";
  delete controller;
}

}  // namespace

MediaPerceptionServiceImpl::MediaPerceptionServiceImpl(
    mojo::ScopedMessagePipeHandle pipe,
    base::Closure connection_error_handler,
    std::shared_ptr<VideoCaptureServiceClient> video_capture_service_client,
    std::shared_ptr<ChromeAudioServiceClient> chrome_audio_service_client,
    std::shared_ptr<Rtanalytics> rtanalytics)
    : receiver_(this,
                mojo::InterfaceRequest<
                    chromeos::media_perception::mojom::MediaPerceptionService>(
                    std::move(pipe))),
      video_capture_service_client_(video_capture_service_client),
      chrome_audio_service_client_(chrome_audio_service_client),
      rtanalytics_(rtanalytics) {
  receiver_.set_disconnect_handler(std::move(connection_error_handler));
}

void MediaPerceptionServiceImpl::GetController(
    mojo::PendingReceiver<
        chromeos::media_perception::mojom::MediaPerceptionController> receiver,
    mojo::PendingRemote<
        chromeos::media_perception::mojom::MediaPerceptionControllerClient>
        client) {
  client_ = mojo::Remote<
      chromeos::media_perception::mojom::MediaPerceptionControllerClient>(
      std::move(client));

  // Use a connection error handler to strongly bind |controller| to |request|.
  MediaPerceptionControllerImpl* const controller =
      new MediaPerceptionControllerImpl(
          std::move(receiver), video_capture_service_client_,
          chrome_audio_service_client_, rtanalytics_);
  controller->set_connection_error_handler(
      base::Bind(&OnConnectionClosedOrError, base::Unretained(controller)));
}

void MediaPerceptionServiceImpl::ConnectToVideoCaptureService(
    mojo::PendingReceiver<video_capture::mojom::VideoSourceProvider> receiver) {
  if (client_)
    client_->ConnectToVideoCaptureService(std::move(receiver));
}

}  // namespace mri
