// Copyright (c) 2012 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/command_line.h>
#include <base/logging.h>
#include <base/memory/weak_ptr.h>
#include <base/time/time.h>
#include <brillo/daemons/dbus_daemon.h>
#include <brillo/flag_helper.h>
#include <brillo/syslog_logging.h>
#include <chromeos/dbus/service_constants.h>

#include "permission_broker/permission_broker.h"

namespace permission_broker {

using brillo::dbus_utils::AsyncEventSequencer;

class Daemon : public brillo::DBusServiceDaemon {
 public:
  Daemon(const std::string& udev_run_path, const base::TimeDelta& poll_interval)
      : DBusServiceDaemon(kPermissionBrokerServiceName),
        udev_run_path_(udev_run_path),
        poll_interval_(poll_interval) {}

 protected:
  void RegisterDBusObjectsAsync(AsyncEventSequencer* sequencer) override {
    broker_ = std::make_unique<PermissionBroker>(bus_, udev_run_path_,
                                                 poll_interval_);
    broker_->RegisterAsync(AsyncEventSequencer::GetDefaultCompletionAction());
  }

 private:
  std::unique_ptr<PermissionBroker> broker_;
  std::string udev_run_path_;
  base::TimeDelta poll_interval_;

  DISALLOW_COPY_AND_ASSIGN(Daemon);
};

}  // namespace permission_broker

int main(int argc, char** argv) {
  DEFINE_int32(poll_interval, 100,
               "The interval at which to poll for udev events. "
               "Given in milliseconds.");
  DEFINE_string(udev_run_path, "/run/udev",
                "The path to udev's run directory.");

  brillo::FlagHelper::Init(argc, argv, "Chromium OS Permission Broker");
  brillo::InitLog(brillo::kLogToSyslog);

  permission_broker::Daemon daemon(
      FLAGS_udev_run_path,
      base::TimeDelta::FromMilliseconds(FLAGS_poll_interval));
  return daemon.Run();
}
