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

#ifndef SRC_DEVELOPER_FORENSICS_FEEDBACK_DATA_LOG_SOURCE_H_
#define SRC_DEVELOPER_FORENSICS_FEEDBACK_DATA_LOG_SOURCE_H_

#include <fuchsia/diagnostics/cpp/fidl.h>
#include <fuchsia/logger/cpp/fidl.h>
#include <lib/async/dispatcher.h>
#include <lib/fpromise/result.h>
#include <lib/sys/cpp/service_directory.h>

#include <memory>
#include <string>
#include <vector>

#include "src/lib/backoff/backoff.h"
#include "src/lib/fxl/memory/weak_ptr.h"

namespace forensics::feedback_data {

// Receives logs emitted by the system.
class LogSink {
 public:
  // A message is a FIDL LogMessage or an error string.
  using MessageOr = ::fpromise::result<fuchsia::logger::LogMessage, std::string>;

  // Adds |message| to the sink.
  //
  // Returns false if the write fails though callers are not expected to take action on failure.
  virtual bool Add(MessageOr message) = 0;

  // Notifies the sink the log source was interrupted and the messages it received in the past may
  // be sent again.
  virtual void NotifyInterruption() = 0;

  // Returns true if the sink is safe to use after an interruption has occurred.
  virtual bool SafeAfterInterruption() const = 0;
};

// Receives log messages from the system's logging service and dispatches them to a sink.
class LogSource {
 public:
  LogSource(async_dispatcher_t* dispatcher, std::shared_ptr<sys::ServiceDirectory> services,
            LogSink* sink, std::unique_ptr<backoff::Backoff> backoff = nullptr);

  // Starts log collection.
  //
  // Note: a check-fail will occur if |sink_| cannot safely receive messages after being interrupted
  // and the log stream has stopped due to a disconnection or call to Stop.
  void Start();

  // Stops log collection and notfies |sink_| collection was interrupted.
  void Stop();

 private:
  void OnDisconnect();
  void GetNext();

  async_dispatcher_t* dispatcher_;
  std::shared_ptr<sys::ServiceDirectory> services_;

  LogSink* sink_;
  fuchsia::diagnostics::ArchiveAccessorPtr archive_accessor_;
  fuchsia::diagnostics::BatchIteratorPtr batch_iterator_;

  bool is_stopped_{false};
  std::unique_ptr<backoff::Backoff> backoff_;
  fxl::WeakPtrFactory<LogSource> ptr_factory_{this};
};

}  // namespace forensics::feedback_data

#endif  // SRC_DEVELOPER_FORENSICS_FEEDBACK_DATA_LOG_SOURCE_H_
