// Copyright 2021 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.

#ifndef SRC_DEVELOPER_FORENSICS_FEEDBACK_CRASH_REPORTS_H_
#define SRC_DEVELOPER_FORENSICS_FEEDBACK_CRASH_REPORTS_H_

#include <fuchsia/feedback/cpp/fidl.h>
#include <lib/async/dispatcher.h>
#include <lib/fidl/cpp/binding_set.h>

#include "src/developer/forensics/crash_reports/annotation_map.h"
#include "src/developer/forensics/crash_reports/config.h"
#include "src/developer/forensics/crash_reports/crash_register.h"
#include "src/developer/forensics/crash_reports/crash_reporter.h"
#include "src/developer/forensics/crash_reports/crash_server.h"
#include "src/developer/forensics/crash_reports/info/info_context.h"
#include "src/developer/forensics/crash_reports/info/main_service_info.h"
#include "src/developer/forensics/crash_reports/log_tags.h"
#include "src/developer/forensics/crash_reports/snapshot_manager.h"
#include "src/developer/forensics/feedback/annotations/annotation_manager.h"
#include "src/developer/forensics/utils/errors.h"
#include "src/developer/forensics/utils/storage_size.h"

namespace forensics::feedback {

class CrashReports {
 public:
  struct Options {
    crash_reports::Config config;
    StorageSize snapshot_manager_max_annotations_size;
    StorageSize snapshot_manager_max_archives_size;
    zx::duration snapshot_manager_window_duration;
  };

  CrashReports(async_dispatcher_t* dispatcher, std::shared_ptr<sys::ServiceDirectory> services,
               timekeeper::Clock* clock, inspect::Node* inspect_root,
               feedback::AnnotationManager* annotation_manager,
               fuchsia::feedback::DataProvider* data_provider, Options options);

  void Handle(::fidl::InterfaceRequest<fuchsia::feedback::CrashReporter> request,
              ::fit::function<void(zx_status_t)> error_handler);
  void Handle(::fidl::InterfaceRequest<fuchsia::feedback::CrashReportingProductRegister> request,
              ::fit::function<void(zx_status_t)> error_handler);

  fuchsia::feedback::CrashReporter* CrashReporter();

  void ShutdownImminent();

 private:
  async_dispatcher_t* dispatcher_;

  std::shared_ptr<crash_reports::InfoContext> info_context_;
  crash_reports::LogTags tags_;
  crash_reports::CrashServer crash_server_;
  crash_reports::SnapshotManager snapshot_manager_;
  crash_reports::CrashRegister crash_register_;
  crash_reports::CrashReporter crash_reporter_;

  crash_reports::MainServiceInfo info_;

  ::fidl::BindingSet<fuchsia::feedback::CrashReporter> crash_reporter_connections_;
  ::fidl::BindingSet<fuchsia::feedback::CrashReportingProductRegister>
      crash_reporting_product_register_connections_;
};

}  // namespace forensics::feedback

#endif  // SRC_DEVELOPER_FORENSICS_FEEDBACK_CRASH_REPORTS_H_
