// 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 <base/at_exit.h>
#include <memory>

#include "base/logging.h"
#include "media_perception/chrome_audio_service_client.h"
#include "media_perception/chrome_audio_service_client_impl.h"
#include "media_perception/cros_dbus_service.h"
#include "media_perception/dbus_service.h"
#include "media_perception/rtanalytics.h"
#include "media_perception/video_capture_service_client.h"
#include "media_perception/video_capture_service_client_impl.h"

// Rtanalytics implementation to be fulfilled by the library side.
extern "C" void init_mps(
    int argc, char** argv,
    std::shared_ptr<mri::ChromeAudioServiceClient> cras,
    std::shared_ptr<mri::VideoCaptureServiceClient> vidcap,
    std::shared_ptr<mri::Rtanalytics>* rtanalytics);

int main(int argc, char** argv) {
  // Needs to exist for creating and starting ipc_thread.
  base::AtExitManager exit_manager;

  mri::MojoConnector mojo_connector;
  mri::CrOSDbusService* cros_dbus_service = new mri::CrOSDbusService();
  cros_dbus_service->SetMojoConnector(&mojo_connector);

  mri::VideoCaptureServiceClientImpl* vidcap_client =
      new mri::VideoCaptureServiceClientImpl();
  vidcap_client->SetMojoConnector(&mojo_connector);

  auto dbus = std::unique_ptr<mri::DbusService>(cros_dbus_service);
  auto cras =
      std::shared_ptr<mri::ChromeAudioServiceClient>(
          new mri::ChromeAudioServiceClientImpl());
  auto vidcap = std::shared_ptr<mri::VideoCaptureServiceClient>(vidcap_client);
  mojo_connector.SetVideoCaptureServiceClient(vidcap);
  mojo_connector.SetChromeAudioServiceClient(cras);

  auto rtanalytics = std::shared_ptr<mri::Rtanalytics>();
  init_mps(argc, argv, cras, vidcap, &rtanalytics);
  mojo_connector.SetRtanalytics(rtanalytics);

  cros_dbus_service->Connect(mri::Service::MEDIA_PERCEPTION);
  if (!cros_dbus_service->IsConnected()) {
    LOG(ERROR) << "Failed to connect to D-Bus.";
    return EXIT_FAILURE;
  }
  cros_dbus_service->PollMessageQueue();

  return EXIT_SUCCESS;
}
