// Copyright 2019 The Fuchsia 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 <fuchsia/feedback/cpp/fidl.h>
#include <lib/fidl/cpp/interface_request.h>
#include <lib/syslog/cpp/log_settings.h>
#include <lib/syslog/cpp/macros.h>

#include <memory>

#include "src/developer/forensics/feedback_data/main_service.h"
#include "src/developer/forensics/utils/component/component.h"

namespace forensics {
namespace feedback_data {

int main() {
  syslog::SetTags({"forensics", "feedback"});

  forensics::component::Component component;

  std::unique_ptr<MainService> main_service =
      MainService::TryCreate(component.Dispatcher(), component.Services(), component.InspectRoot(),
                             component.IsFirstInstance());
  if (!main_service) {
    return EXIT_FAILURE;
  }

  main_service->SpawnSystemLogRecorder();

  // fuchsia.feedback.ComponentDataRegister
  component.AddPublicService(
      ::fidl::InterfaceRequestHandler<fuchsia::feedback::ComponentDataRegister>(
          [&main_service](
              ::fidl::InterfaceRequest<fuchsia::feedback::ComponentDataRegister> request) {
            main_service->HandleComponentDataRegisterRequest(std::move(request));
          }));

  // fuchsia.feedback.DataProvider
  component.AddPublicService(::fidl::InterfaceRequestHandler<fuchsia::feedback::DataProvider>(
      [&main_service](::fidl::InterfaceRequest<fuchsia::feedback::DataProvider> request) {
        main_service->HandleDataProviderRequest(std::move(request));
      }));

  // fuchsia.feedback.DevideIdProvider
  component.AddPublicService(::fidl::InterfaceRequestHandler<fuchsia::feedback::DeviceIdProvider>(
      [&main_service](::fidl::InterfaceRequest<fuchsia::feedback::DeviceIdProvider> request) {
        main_service->HandleDeviceIdProviderRequest(std::move(request));
      }));

  component.RunLoop();

  return EXIT_SUCCESS;
}

}  // namespace feedback_data
}  // namespace forensics
