// 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_COMPONENT_MANAGER_IMPL_H_
#define LIBWEAVE_SRC_COMPONENT_MANAGER_IMPL_H_

#include "src/commands/command_queue.h"
#include "src/component_manager.h"
#include "src/states/state_change_queue.h"

namespace weave {

class ComponentManagerImpl final : public ComponentManager {
 public:
  ComponentManagerImpl();
  explicit ComponentManagerImpl(base::Clock* clock);
  ~ComponentManagerImpl() override;

  // Loads trait definition schema.
  bool LoadTraits(const base::DictionaryValue& dict, ErrorPtr* error) override;

  // Same as the overload above, but takes a json string to read the trait
  // definitions from.
  bool LoadTraits(const std::string& json, ErrorPtr* error) override;

  // Sets callback which is called when new trait definitions are added.
  void AddTraitDefChangedCallback(const base::Closure& callback) override;

  // Adds a new component instance to device.
  // |path| is a path to the parent component (or empty string if a root-level
  // component is being added).
  // |name| is a component name being added.
  // |traits| is a list of trait names this component supports.
  bool AddComponent(const std::string& path,
                    const std::string& name,
                    const std::vector<std::string>& traits,
                    ErrorPtr* error) override;

  // Adds a new component instance to device, as a part of component array.
  // |path| is a path to the parent component.
  // |name| is an array root element inside the child components.
  // |traits| is a list of trait names this component supports.
  bool AddComponentArrayItem(const std::string& path,
                             const std::string& name,
                             const std::vector<std::string>& traits,
                             ErrorPtr* error) override;

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

  // Adds a new command instance to the command queue. The command specified in
  // |command_instance| must be fully initialized and have its name, component,
  // id populated.
  void AddCommand(
      std::unique_ptr<CommandInstance> command_instance) override;

  // Parses the command definition from a json dictionary. The resulting command
  // instance is populated with all the required fields and partially validated
  // against syntax/schema.
  // The new command ID is returned through optional |id| param.
  std::unique_ptr<CommandInstance> ParseCommandInstance(
      const base::DictionaryValue& command,
      Command::Origin command_origin,
      UserRole role,
      std::string* id,
      ErrorPtr* error) override;

  // Find a command instance with the given ID in the command queue.
  CommandInstance* FindCommand(const std::string& id) override;

  // Command queue monitoring callbacks (called when a new command is added to
  // or removed from the queue).
  void AddCommandAddedCallback(
      const CommandQueue::CommandCallback& callback) override;
  void AddCommandRemovedCallback(
      const CommandQueue::CommandCallback& callback) override;

  // Adds a command handler for specific component's command.
  // |component_path| is a path to target component (e.g. "stove.burners[2]").
  // |command_name| is a full path of the command, including trait name and
  // command name (e.g. "burner.setPower").
  void AddCommandHandler(
      const std::string& component_path,
      const std::string& command_name,
      const Device::CommandHandlerCallback& callback) override;

  // Finds a component instance by its full path.
  const base::DictionaryValue* FindComponent(const std::string& path,
                                             ErrorPtr* error) const override;
  // Finds a definition of trait with the given |name|.
  const base::DictionaryValue* FindTraitDefinition(
      const std::string& name) const override;

  // Finds a command definition, where |command_name| is in the form of
  // "trait.command".
  const base::DictionaryValue* FindCommandDefinition(
      const std::string& command_name) const override;

  // Checks the minimum required user role for a given command.
  bool GetMinimalRole(const std::string& command_name,
                      UserRole* minimal_role,
                      ErrorPtr* error) const override;

  // Returns the full JSON dictionary containing trait definitions.
  const base::DictionaryValue& GetTraits() const override { return traits_; }

  // Returns the full JSON dictionary containing component instances.
  const base::DictionaryValue& GetComponents() const override {
    return components_;
  }

  // Component state manipulation methods.
  bool SetStateProperties(const std::string& component_path,
                          const base::DictionaryValue& dict,
                          ErrorPtr* error) override;
  bool SetStatePropertiesFromJson(const std::string& component_path,
                                  const std::string& json,
                                  ErrorPtr* error) override;
  const base::Value* GetStateProperty(const std::string& component_path,
                                      const std::string& name,
                                      ErrorPtr* error) const override;
  bool SetStateProperty(const std::string& component_path,
                        const std::string& name,
                        const base::Value& value,
                        ErrorPtr* error) override;

  void AddStateChangedCallback(const base::Closure& callback) override;

  // Returns the recorded state changes since last time this method was called.
  StateSnapshot GetAndClearRecordedStateChanges() override;

  // Called to notify that the state patch with |id| has been successfully sent
  // to the server and processed.
  void NotifyStateUpdatedOnServer(UpdateID id) override;

  // Returns an ID of last state change update. Each SetStatePropertyNNN()
  // invocation increments this value by 1.
  UpdateID GetLastStateChangeId() const override {
    return last_state_change_id_;
  }

  // Subscribes for device state update notifications from cloud server.
  // The |callback| will be called every time a state patch with given ID is
  // successfully received and processed by Weave server.
  // Returns a subscription token. As soon as this token is destroyed, the
  // respective callback is removed from the callback list.
  Token AddServerStateUpdatedCallback(
      const base::Callback<void(UpdateID)>& callback) override;

  // Helper method for legacy API to obtain first component that implements
  // the given trait. This is useful for routing commands that have no component
  // path specified.
  // Returns empty string if no components are found.
  // This method only searches for component on the top level of components
  // tree. No sub-components are searched.
  std::string FindComponentWithTrait(const std::string& trait) const override;

  // Support for legacy APIs. Setting command and state definitions.
  // This translates into modifying a trait definition.
  bool AddLegacyCommandDefinitions(const base::DictionaryValue& dict,
                                   ErrorPtr* error) override;
  bool AddLegacyStateDefinitions(const base::DictionaryValue& dict,
                                 ErrorPtr* error) override;
  // Returns device state for legacy APIs.
  const base::DictionaryValue& GetLegacyState() const override;
  // Returns command definitions for legacy APIs.
  const base::DictionaryValue& GetLegacyCommandDefinitions() const override;

 private:
  // A helper method to find a JSON element of component at |path| to add new
  // sub-components to.
  base::DictionaryValue* FindComponentGraftNode(const std::string& path,
                                                ErrorPtr* error);
  base::DictionaryValue* FindMutableComponent(const std::string& path,
                                              ErrorPtr* error);

  // Legacy API support: Helper function to support state/command definitions.
  // Adds the given trait to at least one component.
  // Searches for available components and if none of them already supports this
  // trait, it adds it to the first available component.
  void AddTraitToLegacyComponent(const std::string& trait);

  // Helper method to find a sub-component given a root node and a relative path
  // from the root to the target component.
  static const base::DictionaryValue* FindComponentAt(
      const base::DictionaryValue* root,
      const std::string& path,
      ErrorPtr* error);

  base::Clock* clock_{nullptr};
  // An ID of last state change update. Each NotifyPropertiesUpdated()
  // invocation increments this value by 1.
  UpdateID last_state_change_id_{0};
  // Callback list for state change queue event sinks.
  // This member must be defined before |command_queue_|.
  base::CallbackList<void(UpdateID)> on_server_state_updated_;

  base::DictionaryValue traits_;  // Trait definitions.
  base::DictionaryValue components_;  // Component instances.
  CommandQueue command_queue_;  // Command queue containing command instances.
  std::vector<base::Closure> on_trait_changed_;
  std::vector<base::Closure> on_componet_tree_changed_;
  std::vector<base::Closure> on_state_changed_;
  uint32_t next_command_id_{0};
  std::map<std::string, std::unique_ptr<StateChangeQueue>> state_change_queues_;

  // Legacy API support.
  mutable base::DictionaryValue legacy_state_;  // Device state.
  mutable base::DictionaryValue legacy_command_defs_;  // Command definitions.

  DISALLOW_COPY_AND_ASSIGN(ComponentManagerImpl);
};

}  // namespace weave

#endif  // LIBWEAVE_SRC_COMPONENT_MANAGER_IMPL_H_
