// 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 LIB_SYS_SERVICE_CPP_SERVICE_AGGREGATE_H_
#define LIB_SYS_SERVICE_CPP_SERVICE_AGGREGATE_H_

#include <fuchsia/io/cpp/fidl.h>
#include <lib/fdio/namespace.h>
#include <lib/zx/channel.h>

namespace sys {

// A base class for a service aggregate, providing common functionality.
class ServiceAggregateBase {
 public:
  // Returns whether the underlying directory is valid.
  bool is_valid() const { return dir_.is_valid(); }

  // Returns the channel of the underlying directory.
  const zx::channel& channel() const { return dir_.channel(); }

  // Lists all available instances of a service.
  std::vector<std::string> ListInstances() const;

 protected:
  explicit ServiceAggregateBase(fidl::InterfaceHandle<fuchsia::io::Directory> dir)
      : dir_(std::move(dir)) {}

 private:
  const fidl::InterfaceHandle<fuchsia::io::Directory> dir_;
};

// A service aggregate, containing zero or more instances of a service.
template <typename Service>
struct ServiceAggregate final : public ServiceAggregateBase {
  // Constructs a service aggregate from a `fuchsia::io::Directory`.
  explicit ServiceAggregate(fidl::InterfaceHandle<fuchsia::io::Directory> dir)
      : ServiceAggregateBase(std::move(dir)) {}
};

// Opens a service aggregate at |service_path|, within a directory provided by
// |handle|.
//
// A service aggregate contains zero or more instances of a service.
//
// Returns a `fuchsia::io::Directory`, representing a service aggregate.
fidl::InterfaceHandle<fuchsia::io::Directory> OpenNamedServiceAggregateAt(
    const fidl::InterfaceHandle<fuchsia::io::Directory>& handle, const std::string& service_path);

// Opens a service aggregate for |Service|, within a directory provided by
// |handle|.
//
// A service aggregate contains zero or more instances of a service.
//
// Returns a |ServiceAggregate| for a FIDL-generated service.
template <typename Service>
ServiceAggregate<Service> OpenServiceAggregateAt(
    const fidl::InterfaceHandle<fuchsia::io::Directory>& handle) {
  return ServiceAggregate<Service>(OpenNamedServiceAggregateAt(handle, Service::Name));
}

// Opens a service aggregate at |service_path|, within a namespace provided by
// |ns|.
//
// A service aggregate contains zero or more instances of a service.
//
// |ns| must not be null.
//
// Returns a `fuchsia::io::Directory`, representing a service aggregate.
fidl::InterfaceHandle<fuchsia::io::Directory> OpenNamedServiceAggregateIn(
    fdio_ns_t* ns, const std::string& service_path);

// Opens a service aggregate for |Service|, within a namespace provided by |ns|.
//
// A service aggregate contains zero or more instances of a service.
//
// |ns| must not be null.
//
// Returns a |ServiceAggregate| for a FIDL-generated service.
template <typename Service>
ServiceAggregate<Service> OpenServiceAggregateIn(fdio_ns_t* ns) {
  return ServiceAggregate<Service>(OpenNamedServiceAggregateIn(ns, Service::Name));
}

// Opens a service aggregate at |service_path|, within the default namespace.
//
// A service aggregate contains zero or more instances of a service.
//
// See `fdio_ns_get_installed()`.
//
// Returns a `fuchsia::io::Directory`, representing a service aggregate.
fidl::InterfaceHandle<fuchsia::io::Directory> OpenNamedServiceAggregate(
    const std::string& service_path);

// Opens a service aggregate for |Service|, within the default namespace.
//
// A service aggregate contains zero or more instances of a service.
//
// See `fdio_ns_get_installed()`.
//
// Returns a |ServiceAggregate| for a FIDL-generated service.
template <typename Service>
ServiceAggregate<Service> OpenServiceAggregate() {
  return ServiceAggregate<Service>(OpenNamedServiceAggregate(Service::Name));
}

}  // namespace sys

#endif  // LIB_SYS_SERVICE_CPP_SERVICE_AGGREGATE_H_
