// Copyright 2019 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_SYS_APPMGR_LOG_CONNECTOR_IMPL_H_
#define SRC_SYS_APPMGR_LOG_CONNECTOR_IMPL_H_

#include <fuchsia/sys/internal/cpp/fidl.h>
#include <lib/fidl/cpp/binding_set.h>
#include <lib/fidl/cpp/interface_request.h>

#include <fbl/ref_counted.h>
#include <fbl/ref_ptr.h>

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

namespace component {

class LogConnectorImpl : public fuchsia::sys::internal::LogConnector,
                         public fbl::RefCounted<LogConnectorImpl> {
 public:
  using TakeLogConnectionListenerCallback =
      fit::function<void(fidl::InterfaceRequest<fuchsia::sys::internal::LogConnectionListener>)>;

  // Construct a new connector for the provided realm label. This connector has no parent.
  LogConnectorImpl(std::string realm_label);

  // Construct a new connector for a child realm.
  fbl::RefPtr<LogConnectorImpl> NewChild(std::string child_realm_label);

  void AddConnectorClient(fidl::InterfaceRequest<fuchsia::sys::internal::LogConnector> request);

  // Adds a new LogSink connection from a running component. This LogSink connection is forwarded,
  // with attribution, to the LogConnectionListener.
  void AddLogConnection(std::string component_url, std::string instance_id,
                        fidl::InterfaceRequest<fuchsia::logger::LogSink> connection);

  void OnReady(fit::function<void()> on_ready);

 private:
  // Construct a new connector for the provided realm label.
  LogConnectorImpl(fxl::WeakPtr<LogConnectorImpl> parent, std::string realm_label);

  // |fuchsia::sys::LogConnector|.
  virtual void TakeLogConnectionListener(TakeLogConnectionListenerCallback cb) override;

  fxl::WeakPtr<LogConnectorImpl> parent_;
  std::string realm_label_;
  fidl::BindingSet<fuchsia::sys::internal::LogConnector> bindings_;
  fuchsia::sys::internal::LogConnectionListenerPtr consumer_;
  fidl::InterfaceRequest<fuchsia::sys::internal::LogConnectionListener> consumer_request_;

  // weak_factory_ must be the last member variable.
  fxl::WeakPtrFactory<LogConnectorImpl> weak_factory_;

  fit::optional<fit::function<void()>> on_ready_;

  FXL_DISALLOW_COPY_AND_ASSIGN(LogConnectorImpl);
};

}  // namespace component

#endif  // SRC_SYS_APPMGR_LOG_CONNECTOR_IMPL_H_
