// Copyright 2014 The Chromium OS 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 PEERD_SERVICE_H_
#define PEERD_SERVICE_H_

#include <map>
#include <string>
#include <tuple>
#include <vector>

#include <base/macros.h>
#include <chromeos/dbus/dbus_object.h>
#include <chromeos/dbus/exported_property_set.h>
#include <chromeos/errors/error.h>

#include "peerd/org.chromium.peerd.Service.h"
#include "peerd/typedefs.h"

namespace peerd {

namespace errors {
namespace service {

extern const char kInvalidServiceId[];
extern const char kInvalidServiceInfo[];
extern const char kInvalidServiceOptions[];

}  // namespace service
}  // namespace errors

// Exposes a Service over DBus.  This class is used to represent
// services exposed by the local device as well as remote devices.
class Service : public org::chromium::peerd::ServiceInterface {
 public:
  using ServiceInfo = std::map<std::string, std::string>;
  using IpAddress = std::tuple<std::vector<uint8_t>, uint16_t>;
  using IpAddresses = std::vector<IpAddress>;
  struct MDnsOptions {
    uint16_t port = 0;
  };

  static bool IsValidServiceId(chromeos::ErrorPtr* error,
                               const std::string& service_id);
  static bool IsValidServiceInfo(chromeos::ErrorPtr* error,
                                 const ServiceInfo& service_info);

  // For mDNS we'll encode each key/value pair as an entry in the TXT
  // record.  The max length there is 254 bytes + 1 byte to encode the
  // length of the key/value.
  static const size_t kMaxServiceInfoPairLength = 254;
  // mDNS forbids service types longer than 15 characters.
  static const size_t kMaxServiceIdLength = 15;

  Service(const scoped_refptr<dbus::Bus>& bus,
          chromeos::dbus_utils::ExportedObjectManager* object_manager,
          const dbus::ObjectPath& path);
  bool RegisterAsync(
      chromeos::ErrorPtr* error,
      const std::string& peer_id,
      const std::string& service_id,
      const IpAddresses& addresses,
      const ServiceInfo& service_info,
      const std::map<std::string, chromeos::Any>& options,
      const CompletionAction& completion_callback);
  virtual ~Service() = default;

  // Getters called by publishers.
  std::string GetServiceId() const;
  IpAddresses GetIpAddresses() const;
  ServiceInfo GetServiceInfo() const;
  const MDnsOptions& GetMDnsOptions() const;

  // Update fields of this service.  If any field is found to be invalid, the
  // entire update is discarded.  Returns true if update is applied.
  bool Update(chromeos::ErrorPtr* error,
              const IpAddresses& addresses,
              const ServiceInfo& info,
              const std::map<std::string, chromeos::Any>& options);

 private:
  // Parses options for services being published by this device.
  bool ParseOptions(chromeos::ErrorPtr* error,
                    const std::map<std::string, chromeos::Any>& options,
                    MDnsOptions* mdns_options_out);
  // Checks that |maybe_mdns_options| is a map<string, Any> and then removes
  // values from that dictionary.  Stores the appropriate parsed values into
  // |mdns_options_|.
  bool ExtractMDnsOptions(chromeos::ErrorPtr* error,
                          chromeos::Any* maybe_mdns_options,
                          MDnsOptions* mdns_options_out);


  org::chromium::peerd::ServiceAdaptor dbus_adaptor_{this};
  std::unique_ptr<chromeos::dbus_utils::DBusObject> dbus_object_;
  MDnsOptions parsed_mdns_options_;

  friend class AvahiServicePublisherTest;
  friend class ServiceTest;
  DISALLOW_COPY_AND_ASSIGN(Service);
};

}  // namespace peerd

#endif  // PEERD_SERVICE_H_
