// Copyright 2018 The Chromium 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 OSP_PUBLIC_NETWORK_SERVICE_MANAGER_H_
#define OSP_PUBLIC_NETWORK_SERVICE_MANAGER_H_

#include <memory>

#include "osp/public/protocol_connection_client.h"
#include "osp/public/protocol_connection_server.h"
#include "osp/public/service_listener.h"
#include "osp/public/service_publisher.h"

namespace openscreen {
namespace osp {

// Manages services run as part of the Open Screen Protocol Library.  Library
// embedders should pass instances of required services to Create(), which will
// instantiate the singleton instance of the NetworkServiceManager and take
// ownership of the services.
//
// NOTES: If we add more injectable services, consider implementing a struct to
// hold the config vs. passsing long argument lists.
class NetworkServiceManager final {
 public:
  // Creates the singleton instance of the NetworkServiceManager.  nullptr may
  // be passed for services not provided by the embedder.
  static NetworkServiceManager* Create(
      std::unique_ptr<ServiceListener> mdns_listener,
      std::unique_ptr<ServicePublisher> mdns_publisher,
      std::unique_ptr<ProtocolConnectionClient> connection_client,
      std::unique_ptr<ProtocolConnectionServer> connection_server);

  // Returns the singleton instance of the NetworkServiceManager previously
  // created by Create().
  static NetworkServiceManager* Get();

  // Destroys the NetworkServiceManager singleton and its owned services.  The
  // services must be shut down and no I/O or asynchronous work should be done
  // by the service instance destructors.
  static void Dispose();

  // Returns an instance of the mDNS receiver listener, or nullptr if not
  // provided.
  ServiceListener* GetMdnsServiceListener();

  // Returns an instance of the mDNS receiver publisher, or nullptr if not
  // provided.
  ServicePublisher* GetMdnsServicePublisher();

  // Returns an instance of the protocol connection client, or nullptr if not
  // provided.
  ProtocolConnectionClient* GetProtocolConnectionClient();

  // Returns an instance of the protocol connection server, or nullptr if not
  // provided.
  ProtocolConnectionServer* GetProtocolConnectionServer();

 private:
  NetworkServiceManager(
      std::unique_ptr<ServiceListener> mdns_listener,
      std::unique_ptr<ServicePublisher> mdns_publisher,
      std::unique_ptr<ProtocolConnectionClient> connection_client,
      std::unique_ptr<ProtocolConnectionServer> connection_server);

  ~NetworkServiceManager();

  std::unique_ptr<ServiceListener> mdns_listener_;
  std::unique_ptr<ServicePublisher> mdns_publisher_;
  std::unique_ptr<ProtocolConnectionClient> connection_client_;
  std::unique_ptr<ProtocolConnectionServer> connection_server_;
};

}  // namespace osp
}  // namespace openscreen

#endif  // OSP_PUBLIC_NETWORK_SERVICE_MANAGER_H_
