// 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_DEVICE_MANAGER_H_
#define LIBWEAVE_SRC_DEVICE_MANAGER_H_

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

namespace weave {

class AccessApiHandler;
class AccessRevocationManager;
class BaseApiHandler;
class Config;
class ComponentManager;
class DeviceRegistrationInfo;

namespace privet {
class AuthManager;
class Manager;
}  // namespace privet

class DeviceManager final : public Device {
 public:
  DeviceManager(provider::ConfigStore* config_store,
                provider::TaskRunner* task_runner,
                provider::HttpClient* http_client,
                provider::Network* network,
                provider::DnsServiceDiscovery* dns_sd,
                provider::HttpServer* http_server,
                provider::Wifi* wifi,
                provider::Bluetooth* bluetooth);
  ~DeviceManager() override;

  // Device implementation.
  const Settings& GetSettings() const override;
  void AddSettingsChangedCallback(
      const SettingsChangedCallback& callback) override;
  void AddTraitDefinitionsFromJson(const std::string& json) override;
  void AddTraitDefinitions(const base::DictionaryValue& dict) override;
  const base::DictionaryValue& GetTraits() const override;
  void AddTraitDefsChangedCallback(const base::Closure& callback) override;
  bool AddComponent(const std::string& name,
                    const std::vector<std::string>& traits,
                    ErrorPtr* error) override;
  bool RemoveComponent(const std::string& name, ErrorPtr* error) override;
  void AddComponentTreeChangedCallback(const base::Closure& callback) override;
  const base::DictionaryValue& GetComponents() const override;
  bool SetStatePropertiesFromJson(const std::string& component,
                                  const std::string& json,
                                  ErrorPtr* error) override;
  bool SetStateProperties(const std::string& component,
                          const base::DictionaryValue& dict,
                          ErrorPtr* error) override;
  const base::Value* GetStateProperty(const std::string& component,
                                      const std::string& name,
                                      ErrorPtr* error) const override;
  bool SetStateProperty(const std::string& component,
                        const std::string& name,
                        const base::Value& value,
                        ErrorPtr* error) override;
  void AddCommandHandler(const std::string& component,
                         const std::string& command_name,
                         const CommandHandlerCallback& callback) override;
  bool AddCommand(const base::DictionaryValue& command,
                  std::string* id,
                  ErrorPtr* error) override;
  Command* FindCommand(const std::string& id) override;
  void AddStateChangedCallback(const base::Closure& callback) override;
  void Register(const RegistrationData& registration_data,
                const DoneCallback& callback) override;
  GcdState GetGcdState() const override;
  void AddGcdStateChangedCallback(
      const GcdStateChangedCallback& callback) override;
  void AddPairingChangedCallbacks(
      const PairingBeginCallback& begin_callback,
      const PairingEndCallback& end_callback) override;

  Config* GetConfig();

 private:
  void StartPrivet();
  void StopPrivet();
  void OnSettingsChanged(const Settings& settings);

  provider::TaskRunner* task_runner_{nullptr};
  provider::Network* network_{nullptr};
  provider::DnsServiceDiscovery* dns_sd_{nullptr};
  provider::HttpServer* http_server_{nullptr};
  provider::Wifi* wifi_{nullptr};

  std::unique_ptr<Config> config_;
  std::unique_ptr<privet::AuthManager> auth_manager_;
  std::unique_ptr<ComponentManager> component_manager_;
  std::unique_ptr<DeviceRegistrationInfo> device_info_;
  std::unique_ptr<BaseApiHandler> base_api_handler_;
  std::unique_ptr<AccessRevocationManager> access_revocation_manager_;
  std::unique_ptr<AccessApiHandler> access_api_handler_;
  std::unique_ptr<privet::Manager> privet_;

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

}  // namespace weave

#endif  // LIBWEAVE_SRC_DEVICE_MANAGER_H_
