// Copyright 2020 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_DATA_ARCHIVE_ACCESSOR_PTR_H_
#define SRC_DEVELOPER_FORENSICS_FEEDBACK_DATA_ARCHIVE_ACCESSOR_PTR_H_

#include <fuchsia/diagnostics/cpp/fidl.h>
#include <lib/async/dispatcher.h>
#include <lib/fit/promise.h>
#include <lib/sys/cpp/service_directory.h>

#include <functional>
#include <memory>
#include <optional>
#include <string>
#include <vector>

#include "src/developer/forensics/utils/errors.h"
#include "src/developer/forensics/utils/fidl/oneshot_ptr.h"
#include "src/developer/forensics/utils/fit/timeout.h"
#include "src/lib/fxl/macros.h"

namespace forensics::feedback_data {

// The name of the protocol to use to read Feedback data from the Archive.
constexpr char kArchiveAccessorName[] = "fuchsia.diagnostics.FeedbackArchiveAccessor";

// Wraps around fuchsia::diagnostics::ArchiveAccessorPtr, fuchsia::diagnostics::ReaderPtr and
// fuchsia::diagnostics::BatchIteratorPtr to handle establishing the connection, losing the
// connection, waiting for the callback, enforcing a timeout, etc.
//
// Collect() is expected to be called exactly once.
class ArchiveAccessor {
 public:
  ArchiveAccessor(async_dispatcher_t* dispatcher, std::shared_ptr<sys::ServiceDirectory> services,
                  fuchsia::diagnostics::DataType data_type,
                  fuchsia::diagnostics::StreamMode stream_mode,
                  std::optional<size_t> data_budget = {});

  void Collect(std::function<void(fuchsia::diagnostics::FormattedContent)> write_formatted_content);

  void StopCollect();

  ::fit::promise<void, Error> WaitForDone(fit::Timeout timeout);

 private:
  void AppendNextBatch(
      std::function<void(fuchsia::diagnostics::FormattedContent)> write_formatted_content);

  fidl::OneShotPtr<fuchsia::diagnostics::ArchiveAccessor> archive_;
  fuchsia::diagnostics::StreamParameters stream_parameters_;
  fuchsia::diagnostics::BatchIteratorPtr snapshot_iterator_;

  FXL_DISALLOW_COPY_AND_ASSIGN(ArchiveAccessor);
};

}  // namespace forensics::feedback_data

#endif  // SRC_DEVELOPER_FORENSICS_FEEDBACK_DATA_ARCHIVE_ACCESSOR_PTR_H_
