/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <sysexits.h>

#include <base/logging.h>
#include <base/macros.h>
#include <binderwrapper/binder_wrapper.h>
#include <brillo/binder_watcher.h>
#include <brillo/daemons/daemon.h>
#include <brillo/flag_helper.h>

#include "peripheral_manager.h"

namespace {

class PeripheralManagerDaemon : public brillo::Daemon {
 public:
  PeripheralManagerDaemon() {};

  ~PeripheralManagerDaemon() override = default;

 private:
  // brillo::Daemon:
  int OnInit() override {
    int result = brillo::Daemon::OnInit();
    if (result != EX_OK)
      return result;

    android::BinderWrapper::Create();
    if (!binder_watcher_.Init())
      return EX_OSERR;
    if (!peripheral_manager_.Init())
      return EX_OSERR;

    LOG(INFO) << "Initialization complete";
    return EX_OK;
  }

  brillo::BinderWatcher binder_watcher_;
  android::PeripheralManager peripheral_manager_;

  DISALLOW_COPY_AND_ASSIGN(PeripheralManagerDaemon);
};

}  // namespace

int main(int argc, char *argv[]) {
  brillo::FlagHelper::Init(argc, argv, "Peripheral management daemon");
  logging::InitLogging(logging::LoggingSettings());
  return PeripheralManagerDaemon().Run();
}
