// 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/fpromise/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 {

// 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.
//
// TODO(fxbug.dev/93059): Specialize ArchiveAccessor to only collect Inspect once all logs are
//                        streamed.
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();

  ::fpromise::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_
