// Copyright 2022 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 "src/developer/forensics/feedback/attachment_providers.h"

#include "src/developer/forensics/feedback_data/constants.h"

namespace forensics::feedback {

AttachmentProviders::AttachmentProviders(async_dispatcher_t* dispatcher,
                                         std::shared_ptr<sys::ServiceDirectory> services,
                                         timekeeper::Clock* clock, RedactorBase* redactor,
                                         feedback_data::InspectDataBudget* inspect_data_budget,
                                         std::set<std::string> allowlist,
                                         Attachments static_attachments)
    : kernel_log_(dispatcher, services, AttachmentProviderBackoff(), redactor),
      system_log_(dispatcher, services, clock, redactor, feedback_data::kActiveLoggingPeriod),
      inspect_(dispatcher, services, AttachmentProviderBackoff(), inspect_data_budget),
      attachment_manager_(allowlist, std::move(static_attachments),
                          {
                              {feedback_data::kAttachmentLogKernel, &kernel_log_},
                              {feedback_data::kAttachmentLogSystem, &system_log_},
                              {feedback_data::kAttachmentInspect, &inspect_},
                          }) {
  if (allowlist.empty()) {
    FX_LOGS(WARNING)
        << "Attachment allowlist is empty, no platform attachments will be collected or returned";
  }
}

std::unique_ptr<backoff::Backoff> AttachmentProviders::AttachmentProviderBackoff() {
  return std::unique_ptr<backoff::Backoff>(
      new backoff::ExponentialBackoff(zx::min(1), 2u, zx::hour(1)));
}

}  // namespace forensics::feedback
