// 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;
}
