// Copyright 2021 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 "minios/daemon.h"

#include <utility>

#include <base/check.h>
#include <brillo/message_loops/message_loop.h>
#include <dbus/minios/dbus-constants.h>
#include <sysexits.h>

#include "minios/network_manager.h"
#include "minios/shill_proxy.h"
#include "minios/update_engine_proxy.h"

namespace minios {

Daemon::Daemon() : DBusServiceDaemon(kMiniOsServiceName) {}

void Daemon::Start() {
  mini_os_->Run();
}

int Daemon::OnEventLoopStarted() {
  int return_code = brillo::DBusServiceDaemon::OnEventLoopStarted();
  if (return_code != EX_OK)
    return return_code;

  brillo::MessageLoop::current()->PostTask(
      FROM_HERE, base::Bind(&Daemon::Start, base::Unretained(this)));
  return EX_OK;
}

void Daemon::RegisterDBusObjectsAsync(
    brillo::dbus_utils::AsyncEventSequencer* sequencer) {
  dbus_object_ = std::make_unique<brillo::dbus_utils::DBusObject>(
      nullptr, bus_, org::chromium::MiniOsInterfaceAdaptor::GetObjectPath());

  bus_for_proxies_ = dbus_connection_for_proxies_.Connect();
  CHECK(bus_for_proxies_);

  std::shared_ptr<NetworkManagerInterface> network_manager =
      std::make_shared<NetworkManager>(
          std::make_unique<ShillProxy>(bus_for_proxies_));

  mini_os_ = std::make_shared<MiniOs>(
      std::make_unique<UpdateEngineProxy>(
          std::make_unique<org::chromium::UpdateEngineInterfaceProxy>(
              bus_for_proxies_)),
      network_manager);

  dbus_adaptor_ = std::make_unique<DBusAdaptor>(
      std::make_unique<DBusService>(mini_os_, network_manager));

  dbus_adaptor_->RegisterWithDBusObject(dbus_object_.get());
  dbus_object_->RegisterAsync(
      sequencer->GetHandler("RegisterAsync() failed.", true));
}

}  // namespace minios
