// 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::BindOnce(&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_shared<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
