// 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_DISCOVERED_PEER_H_
#define PEERD_DISCOVERED_PEER_H_

#include <map>
#include <string>

#include <base/time/time.h>

#include "peerd/peer.h"
#include "peerd/technologies.h"

namespace peerd {

class DiscoveredPeer : public Peer {
 public:
  DiscoveredPeer(const scoped_refptr<dbus::Bus>& bus,
                 brillo::dbus_utils::ExportedObjectManager* object_manager,
                 const dbus::ObjectPath& path,
                 technologies::Technology technology);
  ~DiscoveredPeer() override = default;

  // Update |this| with the most recent time |last_seen|.  Note that if
  // |last_seen| is older than the current value we'll discard this
  // advertisement.  Remember that we've seen this peer on the given
  // |technology|.
  virtual void UpdateFromAdvertisement(const base::Time& last_seen,
                                       technologies::Technology technology);
  // Add or update an existing service, and record that we've seen it
  // on the given |technology|.  Note that if the service has been updated
  // more recently than |last_seen|, we'll discard this update.  Remember that
  // we've seen advertisements on |technology| for the given service, and the
  // peer itself.  Updates peer |last_seen| if more recent that the last
  // update.
  virtual void UpdateService(const std::string& service_id,
                             const Service::IpAddresses& addresses,
                             const Service::ServiceInfo& info,
                             const base::Time& last_seen,
                             technologies::Technology technology);
  // Remove knowledge that we were seen on the given technology from |this|
  // and child services.
  virtual void RemoveTechnology(technologies::Technology technology);
  // Remove knowledge that a service was seen on |technology| from service.
  // Removes the service if no remaining technologies claim to have seen it.
  virtual void RemoveTechnologyFromService(const std::string& service_id,
                                           technologies::Technology technology);
  // Returns the number of technologies that we've seen this peer, or child
  // services have been updated over.
  virtual size_t GetTechnologyCount() const;

 private:
  struct ServiceMetadata {
    technologies::TechnologySet technology;
    base::Time last_seen;
  };
  std::map<std::string, ServiceMetadata> service_metadata_;
  technologies::TechnologySet discovered_on_technologies_;

  friend class DiscoveredPeerTest;
  DISALLOW_COPY_AND_ASSIGN(DiscoveredPeer);
};

}  // namespace peerd

#endif  // PEERD_DISCOVERED_PEER_H_
