// Copyright 2021 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <fcntl.h>
#include <stdlib.h>
#include <sysexits.h>

#include <memory>

#include <brillo/compression/compressor_interface.h>
#include <brillo/compression/zlib_compressor.h>
#include <brillo/daemons/daemon.h>
#include <brillo/flag_helper.h>
#include <brillo/message_loops/message_loop.h>
#include <brillo/syslog_logging.h>
#include <chromeos/dbus/service_constants.h>
#include <dbus/bus.h>
#include <dbus/exported_object.h>
#include <dbus/message.h>
#include <dbus/object_proxy.h>

#include "featured/service.h"
#include "featured/store_impl.h"
#include "featured/store_interface.h"
#include "featured/tmp_storage_impl.h"
#include "featured/tmp_storage_interface.h"

namespace {
class FeatureDaemon : public brillo::Daemon {
 public:
  FeatureDaemon() = default;
  FeatureDaemon(const FeatureDaemon&) = delete;
  FeatureDaemon& operator=(const FeatureDaemon&) = delete;
};
}  // namespace

int main(int argc, char** argv) {
  base::CommandLine::Init(argc, argv);

  brillo::InitLog(brillo::kLogToSyslog | brillo::kLogToStderr);

  // Perform necessary initialization for dbus
  // NOTE: If this declaration moves to _after_ the service->Start() call,
  // service->Start segfaults.
  FeatureDaemon daemon;

  dbus::Bus::Options options;
  options.bus_type = dbus::Bus::SYSTEM;
  scoped_refptr<dbus::Bus> bus = new dbus::Bus(options);
  std::unique_ptr<featured::StoreInterface> store =
      featured::StoreImpl::Create();
  if (!store) {
    LOG(ERROR) << "Could not create StoreImpl instance.";
    return EX_UNAVAILABLE;
  }

  std::unique_ptr<featured::TmpStorageInterface> tmp_storage_impl(nullptr);
  if (store) {
    tmp_storage_impl = std::make_unique<featured::TmpStorageImpl>();
  }

  std::unique_ptr<brillo::CompressorInterface> decompressor =
      std::make_unique<brillo::ZlibDecompressor>(
          brillo::ZlibDecompressor::InflateFormat::Gzip);
  if (!decompressor->Initialize()) {
    LOG(ERROR) << "Could not initialize ZlibDecompressor instance.";
    return EX_UNAVAILABLE;
  }

  std::shared_ptr<featured::DbusFeaturedService> service =
      std::make_shared<featured::DbusFeaturedService>(
          std::move(store), std::move(tmp_storage_impl),
          std::move(decompressor));

  CHECK(service->Start(bus.get(), service)) << "Failed to start featured!";

  int rc = daemon.Run();
  return rc == EX_UNAVAILABLE ? EX_OK : rc;
}
