// 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_INCLUDE_WEAVE_DEVICE_H_
#define LIBWEAVE_INCLUDE_WEAVE_DEVICE_H_

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

#include <weave/command.h>
#include <weave/export.h>
#include <weave/provider/bluetooth.h>
#include <weave/provider/config_store.h>
#include <weave/provider/dns_service_discovery.h>
#include <weave/provider/http_client.h>
#include <weave/provider/http_server.h>
#include <weave/provider/network.h>
#include <weave/provider/task_runner.h>
#include <weave/provider/wifi.h>

namespace weave {

// States of Gcd connection.
enum class GcdState {
  kUnconfigured,        // Device was not registered.
  kConnecting,          // We have credentials but not yet connected.
  kConnected,           // We're registered and connected to the cloud.
  kInvalidCredentials,  // Our registration has been revoked.
};

struct RegistrationData {
  explicit RegistrationData(const std::string& ticket = {})
      : ticket_id{ticket} {}

  std::string ticket_id;

  std::string oauth_url;
  std::string client_id;
  std::string client_secret;
  std::string api_key;
  std::string service_url;
  std::string xmpp_endpoint;
};

inline bool operator==(const RegistrationData& l, const RegistrationData& r) {
  return l.ticket_id == r.ticket_id && l.oauth_url == r.oauth_url &&
         l.client_id == r.client_id && l.client_secret == r.client_secret &&
         l.api_key == r.api_key && l.service_url == r.service_url &&
         l.xmpp_endpoint == r.xmpp_endpoint;
}

inline bool operator!=(const RegistrationData& l, const RegistrationData& r) {
  return !(l == r);
}

class Device {
 public:
  virtual ~Device() {}

  // Returns reference the current settings.
  virtual const Settings& GetSettings() const = 0;

  // Callback type for AddSettingsChangedCallback.
  using SettingsChangedCallback =
      base::Callback<void(const Settings& settings)>;

  // Subscribes to notification settings changes.
  virtual void AddSettingsChangedCallback(
      const SettingsChangedCallback& callback) = 0;

  // Adds new trait definitions to device.
  virtual void AddTraitDefinitionsFromJson(const std::string& json) = 0;
  virtual void AddTraitDefinitions(const base::DictionaryValue& dict) = 0;

  // Returns the full JSON dictionary containing trait definitions.
  virtual const base::DictionaryValue& GetTraits() const = 0;

  // Sets callback which is called when new trait definitions are added.
  virtual void AddTraitDefsChangedCallback(const base::Closure& callback) = 0;

  // Adds a new component instance to device. Traits used by this component
  // must be already defined.
  virtual bool AddComponent(const std::string& name,
                            const std::vector<std::string>& traits,
                            ErrorPtr* error) = 0;

  // Removes an existing component instance from device.
  virtual bool RemoveComponent(const std::string& name,
                               ErrorPtr* error) = 0;

  // Sets callback which is called when new components are added.
  virtual void AddComponentTreeChangedCallback(
      const base::Closure& callback) = 0;

  // Returns the full JSON dictionary containing component instances.
  virtual const base::DictionaryValue& GetComponents() const = 0;

  // Sets value of multiple properties of the state.
  // It's recommended to call this to initialize component state defined.
  // Example:
  //   device->SetStatePropertiesFromJson("myComponent",
  //                                      "{'base':{'firmwareVersion':'123'}}")
  // Method completely replaces properties included |json| or |dict|.
  // Properties of the state not included |json| or |dict| will stay unchanged.
  virtual bool SetStatePropertiesFromJson(const std::string& component,
                                          const std::string& json,
                                          ErrorPtr* error) = 0;
  virtual bool SetStateProperties(const std::string& component,
                                  const base::DictionaryValue& dict,
                                  ErrorPtr* error) = 0;

  // Returns value of the single property.
  // |name| is full property name, including trait name. e.g. "base.network".
  virtual const base::Value* GetStateProperty(const std::string& component,
                                              const std::string& name,
                                              ErrorPtr* error) const = 0;

  // Sets value of the single property.
  // |name| is full property name, including trait name. e.g. "base.network".
  virtual bool SetStateProperty(const std::string& component,
                                const std::string& name,
                                const base::Value& value,
                                ErrorPtr* error) = 0;

  // Callback type for AddCommandHandler.
  using CommandHandlerCallback =
      base::Callback<void(const std::weak_ptr<Command>& command)>;

  // Sets handler for new commands added to the queue.
  // |component| is the name of the component for which commands should be
  // handled.
  // |command_name| is the full command name of the command to handle. e.g.
  // "base.reboot". Each command can have no more than one handler.
  // Empty |component| and |command_name| sets default handler for all unhanded
  // commands.
  // No new command handlers can be set after default handler was set.
  virtual void AddCommandHandler(const std::string& component,
                                 const std::string& command_name,
                                 const CommandHandlerCallback& callback) = 0;

  // Adds a new command to the command queue.
  virtual bool AddCommand(const base::DictionaryValue& command,
                          std::string* id,
                          ErrorPtr* error) = 0;

  // Finds a command by the command |id|. Returns nullptr if the command with
  // the given |id| is not found. The returned pointer should not be persisted
  // for a long period of time.
  virtual Command* FindCommand(const std::string& id) = 0;

  // Sets callback which is called when stat is changed.
  virtual void AddStateChangedCallback(const base::Closure& callback) = 0;

  // Returns current state of GCD connection.
  virtual GcdState GetGcdState() const = 0;

  // Callback type for GcdStatusCallback.
  using GcdStateChangedCallback = base::Callback<void(GcdState state)>;

  // Sets callback which is called when state of server connection changed.
  virtual void AddGcdStateChangedCallback(
      const GcdStateChangedCallback& callback) = 0;

  // Registers the device.
  // This is testing method and should not be used by applications.
  virtual void Register(const RegistrationData& registration_data,
                        const DoneCallback& callback) = 0;

  // Handler should display pin code to the user.
  using PairingBeginCallback =
      base::Callback<void(const std::string& session_id,
                          PairingType pairing_type,
                          const std::vector<uint8_t>& code)>;

  // Handler should stop displaying pin code.
  using PairingEndCallback =
      base::Callback<void(const std::string& session_id)>;
  // Subscribes to notification about client pairing events.

  virtual void AddPairingChangedCallbacks(
      const PairingBeginCallback& begin_callback,
      const PairingEndCallback& end_callback) = 0;

  LIBWEAVE_EXPORT static std::unique_ptr<Device> Create(
      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_provider);

  //========================== Deprecated APIs =========================

  // Adds provided commands definitions. Can be called multiple times with
  // condition that definitions do not conflict.
  // Invalid value is fatal.
  // DO NOT USE IN YOUR CODE: use AddTraitDefinitions() instead.
  LIBWEAVE_DEPRECATED virtual void AddCommandDefinitionsFromJson(
      const std::string& json) = 0;
  LIBWEAVE_DEPRECATED virtual void AddCommandDefinitions(
      const base::DictionaryValue& dict) = 0;

  // Sets handler for new commands added to the queue.
  // |command_name| is the full command name of the command to handle. e.g.
  // "base.reboot". Each command can have no more than one handler.
  // Empty |command_name| sets default handler for all unhanded commands.
  // No new command handlers can be set after default handler was set.
  // DO NOT USE IN YOUR CODE: use AddCommandHandler() with component parameter.
  LIBWEAVE_DEPRECATED virtual void AddCommandHandler(
      const std::string& command_name,
      const CommandHandlerCallback& callback) = 0;

  // Adds provided state definitions. Can be called multiple times with
  // condition that definitions do not conflict.
  // Invalid value is fatal.
  // DO NOT USE IN YOUR CODE: use AddTraitDefinitions() instead.
  LIBWEAVE_DEPRECATED virtual void AddStateDefinitionsFromJson(
      const std::string& json) = 0;
  LIBWEAVE_DEPRECATED virtual void AddStateDefinitions(
      const base::DictionaryValue& dict) = 0;

  // Sets value of multiple properties of the state.
  // It's recommended to call this to initialize state defined by
  // AddStateDefinitions.
  // Example:
  //   device->SetStatePropertiesFromJson("{'base':{'firmwareVersion':'123'}}")
  // Method completely replaces properties included |json| or |dict|.
  // Properties of the state not included |json| or |dict| will stay unchanged.
  // DO NOT USE IN YOUR CODE: use SetStateProperties() with component parameter.
  LIBWEAVE_DEPRECATED virtual bool SetStatePropertiesFromJson(
      const std::string& json,
      ErrorPtr* error) = 0;
  LIBWEAVE_DEPRECATED virtual bool SetStateProperties(
      const base::DictionaryValue& dict,
      ErrorPtr* error) = 0;

  // Returns value of the single property.
  // |name| is full property name, including package name. e.g. "base.network".
  // DO NOT USE IN YOUR CODE: use GetStateProperty() with component parameter.
  LIBWEAVE_DEPRECATED virtual const base::Value* GetStateProperty(
      const std::string& name) const = 0;

  // Sets value of the single property.
  // |name| is full property name, including package name. e.g. "base.network".
  // DO NOT USE IN YOUR CODE: use SetStateProperty() with component parameter.
  LIBWEAVE_DEPRECATED virtual bool SetStateProperty(const std::string& name,
                                                    const base::Value& value,
                                                    ErrorPtr* error) = 0;

  // Returns aggregated state properties across all registered packages.
  // DO NOT USE IN YOUR CODE: use GetComponents() instead.
  LIBWEAVE_DEPRECATED virtual const base::DictionaryValue& GetState() const = 0;
};

}  // namespace weave

#endif  // LIBWEAVE_INCLUDE_WEAVE_DEVICE_H_
