// Copyright 2015 The Weave 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 LIBWEAVE_EXAMPLES_UBUNTU_EVENT_NETWORK_H_
#define LIBWEAVE_EXAMPLES_UBUNTU_EVENT_NETWORK_H_

#include <weave/provider/network.h>

#include <base/memory/weak_ptr.h>

struct evdns_base;
struct bufferevent;

namespace weave {
namespace examples {

class EventTaskRunner;

class EventNetworkImpl : public weave::provider::Network {
  class Deleter {
   public:
    void operator()(evdns_base* dns_base);
    void operator()(bufferevent* bev);
  };

 public:
  explicit EventNetworkImpl(EventTaskRunner* task_runner_);
  void AddConnectionChangedCallback(
      const ConnectionChangedCallback& callback) override;
  State GetConnectionState() const override;
  void OpenSslSocket(const std::string& host,
                     uint16_t port,
                     const OpenSslSocketCallback& callback) override;

 private:
  void UpdateNetworkState();
  void UpdateNetworkStateCallback(provider::Network::State state);
  EventTaskRunner* task_runner_{nullptr};
  std::unique_ptr<evdns_base, Deleter> dns_base_;
  std::vector<ConnectionChangedCallback> callbacks_;
  provider::Network::State network_state_{provider::Network::State::kOffline};
  base::WeakPtrFactory<EventNetworkImpl> weak_ptr_factory_{this};
};

}  // namespace examples
}  // namespace weave

#endif  // LIBWEAVE_EXAMPLES_UBUNTU_EVENT_NETWORK_H_
