// Copyright 2017 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_CONNECTIVITY_NETWORK_MDNS_UTIL_MDNS_IMPL_H_
#define SRC_CONNECTIVITY_NETWORK_MDNS_UTIL_MDNS_IMPL_H_

#include <fuchsia/net/mdns/cpp/fidl.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/fit/function.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/zx/channel.h>

#include "src/connectivity/network/mdns/util/commands.h"
#include "src/lib/fsl/tasks/fd_waiter.h"
#include "src/lib/line_input/modal_line_input.h"

namespace mdns {

class MdnsImpl {
 public:
  MdnsImpl(sys::ComponentContext* component_context, Command command,
           async_dispatcher_t* dispatcher, fit::closure quit_callback);

  ~MdnsImpl() = default;

 private:
  class HostNameSubscriptionListener : public fuchsia::net::mdns::HostNameSubscriptionListener {
   public:
    HostNameSubscriptionListener(
        std::string host_name,
        fidl::InterfaceRequest<fuchsia::net::mdns::HostNameSubscriptionListener> request,
        line_input::ModalLineInput& input);

    ~HostNameSubscriptionListener() override = default;

    void set_error_handler(fit::function<void(zx_status_t)> error_handler);

    // fuchsia::net::mdns::HostNameSubscriptionListener implementation.
    void OnAddressesChanged(std::vector<fuchsia::net::mdns::HostAddress> addresses,
                            OnAddressesChangedCallback callback) override;

   private:
    std::string host_name_;
    fidl::Binding<fuchsia::net::mdns::HostNameSubscriptionListener> binding_;
    line_input::ModalLineInput& input_;
  };

  class ServiceSubscriptionListener : public fuchsia::net::mdns::ServiceSubscriptionListener {
   public:
    ServiceSubscriptionListener(
        const std::string& service_name,
        fidl::InterfaceRequest<fuchsia::net::mdns::ServiceSubscriptionListener> request,
        line_input::ModalLineInput& input);

    ~ServiceSubscriptionListener() override = default;

    void set_error_handler(fit::function<void(zx_status_t)> error_handler);

    // fuchsia::net::mdns::ServiceSubscriptionListener implementation.
    void OnInstanceDiscovered(fuchsia::net::mdns::ServiceInstance instance,
                              OnInstanceDiscoveredCallback callback) override;

    void OnInstanceChanged(fuchsia::net::mdns::ServiceInstance instance,
                           OnInstanceChangedCallback callback) override;

    void OnInstanceLost(std::string service_name, std::string instance_name,
                        OnInstanceLostCallback callback) override;

    void OnQuery(fuchsia::net::mdns::ResourceType resource_type, OnQueryCallback callback) override;

   private:
    std::string service_name_;
    fidl::Binding<fuchsia::net::mdns::ServiceSubscriptionListener> binding_;
    line_input::ModalLineInput& input_;
  };

  class ServiceInstancePublicationResponder
      : public fuchsia::net::mdns::ServiceInstancePublicationResponder {
   public:
    ServiceInstancePublicationResponder(
        fidl::InterfaceRequest<fuchsia::net::mdns::ServiceInstancePublicationResponder> request,
        line_input::ModalLineInput& input,
        fuchsia::net::mdns::ServiceInstancePublication publication);

    ~ServiceInstancePublicationResponder() override = default;

    void set_error_handler(fit::function<void(zx_status_t)> error_handler);

    // fuchsia::net::mdns::ServiceInstancePublicationResponder implementation.
    void OnPublication(fuchsia::net::mdns::ServiceInstancePublicationCause publication_cause,
                       fidl::StringPtr subtype,
                       std::vector<fuchsia::net::IpAddress> source_addresses,
                       OnPublicationCallback callback) override;

   private:
    fidl::Binding<fuchsia::net::mdns::ServiceInstancePublicationResponder> binding_;
    line_input::ModalLineInput& input_;
    fuchsia::net::mdns::ServiceInstancePublication publication_;
  };

  class ProxyHost {
   public:
    explicit ProxyHost(fuchsia::net::mdns::ServiceInstancePublisherPtr publisher);

    ~ProxyHost() = default;

    void set_error_handler(fit::function<void(zx_status_t)> error_handler);

    fuchsia::net::mdns::ServiceInstancePublisherPtr& publisher() { return publisher_; }

    bool ResponderExists(std::string instance_full_name);

    void AddResponder(std::string instance_full_name,
                      std::unique_ptr<ServiceInstancePublicationResponder> responder);

    bool RemoveResponder(std::string instance_full_name);

   private:
    fuchsia::net::mdns::ServiceInstancePublisherPtr publisher_;
    std::unordered_map<std::string, std::unique_ptr<ServiceInstancePublicationResponder>>
        service_instance_publication_responders_by_instance_full_name_;
  };

  void ExecuteCommand(const Command& command);

  void WaitForKeystroke();

  void ResolveHost(const std::string& host_name, zx::duration timeout,
                   fuchsia::net::mdns::Media media, fuchsia::net::mdns::IpVersions ip_versions,
                   bool exclude_local, bool exclude_local_proxies);

  void ResolveInstance(const std::string& instance_name, const std::string& service_name,
                       zx::duration timeout, fuchsia::net::mdns::Media media,
                       fuchsia::net::mdns::IpVersions ip_versions, bool exclude_local,
                       bool exclude_local_proxies);

  void SubscribeHost(const std::string& host_name, fuchsia::net::mdns::Media media,
                     fuchsia::net::mdns::IpVersions ip_versions, bool exclude_local,
                     bool exclude_local_proxies);

  void SubscribeService(const std::string& service_name, fuchsia::net::mdns::Media media,
                        fuchsia::net::mdns::IpVersions ip_versions, bool exclude_local,
                        bool exclude_local_proxies);

  void PublishHost(const std::string& host_name, std::vector<inet::IpAddress> addresses, bool probe,
                   fuchsia::net::mdns::Media media, fuchsia::net::mdns::IpVersions ip_versions);

  void PublishInstance(const std::string& instance_name, const std::string& service_name,
                       uint16_t port, const std::vector<std::string>& text, bool probe,
                       fuchsia::net::mdns::Media media, fuchsia::net::mdns::IpVersions ip_versions,
                       uint16_t srv_priority, uint16_t srv_weight, zx::duration ptr_ttl,
                       zx::duration srv_ttl, zx::duration txt_ttl,
                       const std::string& proxy_host_name);

  void UnsubscribeHost(const std::string& host_name);

  void UnsubscribeService(const std::string& service_name);

  void UnpublishHost(const std::string& host_name);

  void UnpublishInstance(const std::string& instance_name, const std::string& service_name,
                         const std::string& proxy_host_name);

  void EnsureHostNameResolver();

  void EnsureServiceInstanceResolver();

  void EnsureHostNameSubscriber();

  void EnsureServiceSubscriber();

  void EnsureProxyHostPublisher();

  void EnsureServiceInstancePublisher();

  // Calls |QuitSync| in a deferred task.
  void Quit();

  // Quits synchronously (actually deletes *this).
  void QuitSync();

  // Calls |Quit| if transient.
  void QuitIfTransient();

  // Shows the input line if not transient.
  void ShowInput();

  // Hides the input line if not transient.
  void HideInput();

  sys::ComponentContext* component_context_;
  async_dispatcher_t* dispatcher_;
  fit::closure quit_callback_;
  bool transient_ = true;
  line_input::ModalLineInput input_;

  fuchsia::net::mdns::HostNameResolverPtr host_name_resolver_;
  fuchsia::net::mdns::ServiceInstanceResolverPtr service_instance_resolver_;
  fuchsia::net::mdns::HostNameSubscriberPtr host_name_subscriber_;
  fuchsia::net::mdns::ServiceSubscriber2Ptr service_subscriber_;
  fuchsia::net::mdns::ProxyHostPublisherPtr proxy_host_publisher_;
  fuchsia::net::mdns::ServiceInstancePublisherPtr service_instance_publisher_;

  std::unordered_map<std::string, std::unique_ptr<HostNameSubscriptionListener>>
      host_name_subscription_listeners_by_host_name_;
  std::unordered_map<std::string, std::unique_ptr<ServiceSubscriptionListener>>
      service_subscription_listeners_by_service_name_;
  std::unordered_map<std::string, std::unique_ptr<ProxyHost>> proxy_hosts_by_name_;
  std::unordered_map<std::string, std::unique_ptr<ServiceInstancePublicationResponder>>
      service_instance_publication_responders_by_instance_full_name_;

  fsl::FDWaiter fd_waiter_;

  // Disallow copy, assign and move.
  MdnsImpl(const MdnsImpl&) = delete;
  MdnsImpl(MdnsImpl&&) = delete;
  MdnsImpl& operator=(const MdnsImpl&) = delete;
  MdnsImpl& operator=(MdnsImpl&&) = delete;
};

}  // namespace mdns

#endif  // SRC_CONNECTIVITY_NETWORK_MDNS_UTIL_MDNS_IMPL_H_
