// 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 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 <base/scoped_observer.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 CommandManager;
class DeviceRegistrationInfo;
class DnsServiceDiscovery;
class Network;
class StateManager;

namespace privet {

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

class Manager : public CloudDelegate::Observer {
 public:
  Manager();
  ~Manager() override;

  void Start(provider::TaskRunner* task_runner,
             provider::Network* network,
             provider::DnsServiceDiscovery* dns_sd,
             provider::HttpServer* http_server,
             provider::Wifi* wifi,
             DeviceRegistrationInfo* device,
             CommandManager* command_manager,
             StateManager* state_manager);

  std::string GetCurrentlyConnectedSsid() const;

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

 private:
  // CloudDelegate::Observer
  void OnDeviceInfoChanged() override;

  void PrivetRequestHandler(
      const provider::HttpServer::Request& request,
      const provider::HttpServer::OnReplyCallback& callback);

  void PrivetResponseHandler(
      const provider::HttpServer::OnReplyCallback& callback,
      int status,
      const base::DictionaryValue& output);

  void OnChanged();
  void OnConnectivityChanged();

  void OnHttpServerStatusChanged(const provider::HttpServer& server);
  void SaveDeviceSecret(Config* config);

  bool disable_security_{false};
  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_;

  ScopedObserver<CloudDelegate, CloudDelegate::Observer> cloud_observer_{this};

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

}  // namespace privet
}  // namespace weave

#endif  // LIBWEAVE_SRC_PRIVET_PRIVET_MANAGER_H_
