// 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_SRC_PRIVET_PRIVET_MANAGER_H_
#define LIBWEAVE_SRC_PRIVET_PRIVET_MANAGER_H_

#include <memory>
#include <set>
#include <string>
#include <vector>

#include <base/memory/weak_ptr.h>
#include <weave/device.h>

#include "src/privet/cloud_delegate.h"
#include "src/privet/security_manager.h"
#include "src/privet/wifi_bootstrap_manager.h"

namespace libwebserv {
class ProtocolHandler;
class Request;
class Response;
class Server;
}

namespace weave {

class ComponentManager;
class DeviceRegistrationInfo;
class DnsServiceDiscovery;
class Network;

namespace privet {

class CloudDelegate;
class DaemonState;
class DeviceDelegate;
class PrivetHandler;
class Publisher;
class SecurityManager;

class Manager {
 public:
  explicit Manager(provider::TaskRunner* task_runner);
  ~Manager();

  void Start(provider::Network* network,
             provider::DnsServiceDiscovery* dns_sd,
             provider::HttpServer* http_server,
             provider::Wifi* wifi,
             AuthManager* auth_manager,
             DeviceRegistrationInfo* device,
             ComponentManager* component_manager);

  std::string GetCurrentlyConnectedSsid() const;

  void AddOnPairingChangedCallbacks(
      const Device::PairingBeginCallback& begin_callback,
      const Device::PairingEndCallback& end_callback);

 private:
  void OnDeviceInfoChanged(const weave::Settings&);

  void PrivetRequestHandler(
      std::unique_ptr<provider::HttpServer::Request> request);

  void PrivetRequestHandlerWithData(
      const std::shared_ptr<provider::HttpServer::Request>& request,
      const std::string& data);

  void PrivetResponseHandler(
      const std::shared_ptr<provider::HttpServer::Request>& request,
      int status,
      const base::DictionaryValue& output);

  void OnChanged();
  void OnConnectivityChanged();

  provider::TaskRunner* task_runner_{nullptr};
  std::unique_ptr<CloudDelegate> cloud_;
  std::unique_ptr<DeviceDelegate> device_;
  std::unique_ptr<SecurityManager> security_;
  std::unique_ptr<WifiBootstrapManager> wifi_bootstrap_manager_;
  std::unique_ptr<Publisher> publisher_;
  std::unique_ptr<PrivetHandler> privet_handler_;

  base::WeakPtrFactory<Manager> weak_ptr_factory_{this};
  DISALLOW_COPY_AND_ASSIGN(Manager);
};

}  // namespace privet
}  // namespace weave

#endif  // LIBWEAVE_SRC_PRIVET_PRIVET_MANAGER_H_
