// Copyright 2020 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 CAST_SENDER_CAST_APP_DISCOVERY_SERVICE_IMPL_H_
#define CAST_SENDER_CAST_APP_DISCOVERY_SERVICE_IMPL_H_

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

#include "cast/common/public/service_info.h"
#include "cast/sender/cast_app_availability_tracker.h"
#include "cast/sender/cast_platform_client.h"
#include "cast/sender/public/cast_app_discovery_service.h"
#include "platform/api/time.h"
#include "util/weak_ptr.h"

namespace openscreen {
namespace cast {

// Keeps track of availability queries, receives receiver updates, and issues
// app availability requests based on these signals.
class CastAppDiscoveryServiceImpl : public CastAppDiscoveryService {
 public:
  // |platform_client| must outlive |this|.
  CastAppDiscoveryServiceImpl(CastPlatformClient* platform_client,
                              ClockNowFunctionPtr clock);
  ~CastAppDiscoveryServiceImpl() override;

  // CastAppDiscoveryService implementation.
  Subscription StartObservingAvailability(
      const CastMediaSource& source,
      AvailabilityCallback callback) override;

  // Reissues app availability requests for currently registered (device_id,
  // app_id) pairs whose status is kUnavailable or kUnknown.
  void Refresh() override;

  void AddOrUpdateReceiver(const ServiceInfo& receiver);
  void RemoveReceiver(const ServiceInfo& receiver);

 private:
  struct AvailabilityCallbackEntry {
    uint32_t id;
    AvailabilityCallback callback;
  };

  // Issues an app availability request for |app_id| to the receiver given by
  // |device_id|.
  void RequestAppAvailability(const std::string& device_id,
                              const std::string& app_id);

  // Updates the availability result for |device_id| and |app_id| with |result|,
  // and notifies callbacks with updated availability query results.
  void UpdateAppAvailability(const std::string& device_id,
                             const std::string& app_id,
                             AppAvailabilityResult result);

  // Updates the availability query results for |sources|.
  void UpdateAvailabilityQueries(const std::vector<CastMediaSource>& sources);

  std::vector<ServiceInfo> GetReceiversByIds(
      const std::vector<std::string>& device_ids) const;

  // Returns true if an app availability request should be issued for
  // |device_id| and |app_id|. |now| is used for checking whether previously
  // cached results should be refreshed.
  bool ShouldRefreshAppAvailability(const std::string& device_id,
                                    const std::string& app_id,
                                    Clock::time_point now) const;

  void RemoveAvailabilityCallback(uint32_t id) override;

  std::map<std::string, ServiceInfo> receivers_by_id_;

  // Registered availability queries and their associated callbacks keyed by
  // media source IDs.
  std::map<std::string, std::vector<AvailabilityCallbackEntry>> avail_queries_;

  // Callback ID tracking.
  uint32_t next_avail_query_id_ = 1U;

  CastPlatformClient* const platform_client_;

  CastAppAvailabilityTracker availability_tracker_;

  const ClockNowFunctionPtr clock_;

  WeakPtrFactory<CastAppDiscoveryServiceImpl> weak_factory_;
};

}  // namespace cast
}  // namespace openscreen

#endif  // CAST_SENDER_CAST_APP_DISCOVERY_SERVICE_IMPL_H_
