// 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_SERVICE_COMMON_MDNS_NAMES_H_
#define SRC_CONNECTIVITY_NETWORK_MDNS_SERVICE_COMMON_MDNS_NAMES_H_

#include <string>

#include "src/lib/inet/socket_address.h"

namespace mdns {

struct MdnsNames {
  // Name used to query for any service on the subnet.
  static const std::string kAnyServiceFullName;

  // Constructs a local host name from a simple host name. For example, produces
  // "host.local." from "host".
  static std::string HostFullName(const std::string& host_name);

  // Constructs a simple host name from a local host name. For example, produces
  // "host" from "host.local.".
  static std::string HostNameFromFullName(const std::string& host_full_name);

  // Constructs a local service name from a simple service name. For example,
  // produces "_foo._tcp.local." from "_foo._tcp.".
  static std::string ServiceFullName(const std::string& service_name);

  // Constructs a local service name from a simple service name and subtype.
  // For example, produces "_bar._sub_.foo._tcp.local." from "_foo._tcp." and
  // subtype "_bar".
  static std::string ServiceSubtypeFullName(const std::string& service_name,
                                            const std::string& subtype);

  // Constructs a local service instance name from a simple instance name and
  // a simple service name. For example, produces "myfoo._foo._tcp.local." from
  // "myfoo" and "_foo._tcp.". The simple instance name must not end in a ".",
  // and the simple service name must end in ".".
  static std::string InstanceFullName(const std::string& instance_name,
                                      const std::string& service_name);

  // Parses an instance full name to extract the simple instance name and the simple service
  // name.
  static bool SplitInstanceFullName(const std::string& instance_full_name,
                                    std::string* instance_name_out, std::string* service_name_out);

  // Determines if |name| is a local service name matching |service_name| or
  // a subtype of |service_name|. If |name| does specify a subtype, the
  // subtype is returned via |subtype_out|. Otherwise |*subtype_out| is
  // cleared.
  static bool MatchServiceName(const std::string& name, const std::string& service_name,
                               std::string* subtype_out);

  // Determines if |host_name| is a valid host name.
  static bool IsValidHostName(const std::string& host_name);

  // Determines if |service_name| is a valid simple service name.
  static bool IsValidServiceName(const std::string& service_name);

  // Determines if |instance_name| is a valid simple instance name.
  static bool IsValidInstanceName(const std::string& instance_name);

  // Determines if |subtype_name| is a valid simple subtype name.
  static bool IsValidSubtypeName(const std::string& subtype_name);

  // Determines if |text_string| is a valid text string.
  static bool IsValidTextString(const std::string& text_string);

  // Determines if |text_string| is a valid text string.
  static bool IsValidTextString(const std::vector<uint8_t>& text_string);

  // Returns the alternate host name for |host_name|. For example, if |host_name| is
  // "fuchsia-1234-5678-9abc", this method returns "123456789ABC". If |host_name| isn't
  // the expected size (22 characters), this method returns the |host_name| argument.
  // TODO(https://fxbug.dev/42065146): Remove this when alt_services is no longer needed.
  static std::string AltHostName(const std::string& host_name);
};

}  // namespace mdns

#endif  // SRC_CONNECTIVITY_NETWORK_MDNS_SERVICE_COMMON_MDNS_NAMES_H_
