// Copyright 2018 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 SHILL_PROPERTY_STORE_H_
#define SHILL_PROPERTY_STORE_H_

#include <map>
#include <memory>
#include <string>
#include <vector>

#include <base/callback.h>
#include <base/macros.h>
#include <brillo/any.h>
#include <brillo/variant_dictionary.h>

#include "shill/accessor_interface.h"
#include "shill/key_value_store.h"
#include "shill/property_iterator.h"

namespace shill {

class Error;

class PropertyStore {
 public:
  using PropertyChangeCallback = base::Callback<void(const std::string&)>;
  PropertyStore();
  explicit PropertyStore(PropertyChangeCallback property_change_callback);
  PropertyStore(const PropertyStore&) = delete;
  PropertyStore& operator=(const PropertyStore&) = delete;

  virtual ~PropertyStore();

  virtual bool Contains(const std::string& property) const;

  // Setting properties using brillo::Any variant type.
  bool SetAnyProperty(const std::string& name,
                      const brillo::Any& value,
                      Error* error);
  bool SetProperties(const brillo::VariantDictionary& in, Error* error);

  // Retrieve all properties and store them in a brillo::VariantDictionary
  // (std::map<std::string, brillo::Any>).
  bool GetProperties(brillo::VariantDictionary* out, Error* error) const;

  // Methods to allow the getting of properties stored in the referenced
  // |store_| by name. Upon success, these methods return true and return the
  // property value in |value|. Upon failure, they return false and
  // leave |value| untouched.
  bool GetBoolProperty(const std::string& name,
                       bool* value,
                       Error* error) const;
  bool GetInt16Property(const std::string& name,
                        int16_t* value,
                        Error* error) const;
  bool GetInt32Property(const std::string& name,
                        int32_t* value,
                        Error* error) const;
  bool GetKeyValueStoreProperty(const std::string& name,
                                KeyValueStore* value,
                                Error* error) const;
  bool GetStringProperty(const std::string& name,
                         std::string* value,
                         Error* error) const;
  bool GetStringmapProperty(const std::string& name,
                            Stringmap* values,
                            Error* error) const;
  bool GetStringmapsProperty(const std::string& name,
                             Stringmaps* values,
                             Error* error) const;
  bool GetStringsProperty(const std::string& name,
                          Strings* values,
                          Error* error) const;
  bool GetUint8Property(const std::string& name,
                        uint8_t* value,
                        Error* error) const;
  bool GetByteArrayProperty(const std::string& name,
                            ByteArray* value,
                            Error* error) const;
  bool GetUint16Property(const std::string& name,
                         uint16_t* value,
                         Error* error) const;
  bool GetUint16sProperty(const std::string& name,
                          Uint16s* value,
                          Error* error) const;
  bool GetUint32Property(const std::string& name,
                         uint32_t* value,
                         Error* error) const;
  bool GetUint64Property(const std::string& name,
                         uint64_t* value,
                         Error* error) const;
  bool GetRpcIdentifierProperty(const std::string& name,
                                RpcIdentifier* value,
                                Error* error) const;

  // Methods to allow the setting, by name, of properties stored in this object.
  // The property names are declared in chromeos/dbus/service_constants.h,
  // so that they may be shared with libcros.
  // If the property is successfully changed, these methods return true,
  // and leave |error| untouched.
  // If the property is unchanged because it already has the desired value,
  // these methods return false, and leave |error| untouched.
  // If the property change fails, these methods return false, and update
  // |error|. However, updating |error| is skipped if |error| is NULL.
  virtual bool SetBoolProperty(const std::string& name,
                               bool value,
                               Error* error);

  virtual bool SetInt16Property(const std::string& name,
                                int16_t value,
                                Error* error);

  virtual bool SetInt32Property(const std::string& name,
                                int32_t value,
                                Error* error);

  virtual bool SetKeyValueStoreProperty(const std::string& name,
                                        const KeyValueStore& value,
                                        Error* error);

  virtual bool SetStringProperty(const std::string& name,
                                 const std::string& value,
                                 Error* error);

  virtual bool SetStringmapProperty(
      const std::string& name,
      const std::map<std::string, std::string>& values,
      Error* error);

  virtual bool SetStringmapsProperty(
      const std::string& name,
      const std::vector<std::map<std::string, std::string>>& values,
      Error* error);

  virtual bool SetStringsProperty(const std::string& name,
                                  const std::vector<std::string>& values,
                                  Error* error);

  virtual bool SetUint8Property(const std::string& name,
                                uint8_t value,
                                Error* error);

  virtual bool SetByteArrayProperty(const std::string& name,
                                    const ByteArray& value,
                                    Error* error);

  virtual bool SetUint16Property(const std::string& name,
                                 uint16_t value,
                                 Error* error);

  virtual bool SetUint16sProperty(const std::string& name,
                                  const std::vector<uint16_t>& value,
                                  Error* error);

  virtual bool SetUint32Property(const std::string& name,
                                 uint32_t value,
                                 Error* error);

  virtual bool SetUint64Property(const std::string& name,
                                 uint64_t value,
                                 Error* error);

  virtual bool SetRpcIdentifierProperty(const std::string& name,
                                        const RpcIdentifier& value,
                                        Error* error);

  // Clearing a property resets it to its "factory" value. This value
  // is generally the value that it (the property) had when it was
  // registered with PropertyStore.
  //
  // The exception to this rule is write-only derived properties. For
  // such properties, the property owner explicitly provides a
  // "factory" value at registration time. This is necessary because
  // PropertyStore can't read the current value at registration time.
  //
  // |name| is the key used to access the property. If the property
  // cannot be cleared, |error| is set, and the method returns false.
  // Otherwise, |error| is unchanged, and the method returns true.
  virtual bool ClearProperty(const std::string& name, Error* error);

  // Accessors for iterators over property maps. Useful for dumping all
  // properties.
  ReadablePropertyConstIterator<bool> GetBoolPropertiesIter() const;
  ReadablePropertyConstIterator<int16_t> GetInt16PropertiesIter() const;
  ReadablePropertyConstIterator<int32_t> GetInt32PropertiesIter() const;
  ReadablePropertyConstIterator<KeyValueStore> GetKeyValueStorePropertiesIter()
      const;
  ReadablePropertyConstIterator<RpcIdentifier> GetRpcIdentifierPropertiesIter()
      const;
  ReadablePropertyConstIterator<RpcIdentifiers>
  GetRpcIdentifiersPropertiesIter() const;
  ReadablePropertyConstIterator<std::string> GetStringPropertiesIter() const;
  ReadablePropertyConstIterator<Stringmap> GetStringmapPropertiesIter() const;
  ReadablePropertyConstIterator<Stringmaps> GetStringmapsPropertiesIter() const;
  ReadablePropertyConstIterator<Strings> GetStringsPropertiesIter() const;
  ReadablePropertyConstIterator<uint8_t> GetUint8PropertiesIter() const;
  ReadablePropertyConstIterator<ByteArray> GetByteArrayPropertiesIter() const;
  ReadablePropertyConstIterator<uint16_t> GetUint16PropertiesIter() const;
  ReadablePropertyConstIterator<Uint16s> GetUint16sPropertiesIter() const;
  ReadablePropertyConstIterator<uint32_t> GetUint32PropertiesIter() const;
  ReadablePropertyConstIterator<uint64_t> GetUint64PropertiesIter() const;

  // Methods for registering a property.
  //
  // It is permitted to re-register a property (in which case the old
  // binding is forgotten). However, the newly bound object must be of
  // the same type.
  //
  // Note that types do not encode read-write permission.  Hence, it
  // is possible to change permissions by rebinding a property to the
  // same object.
  //
  // (Corollary of the rebinding-to-same-type restriction: a
  // PropertyStore cannot hold two properties of the same name, but
  // differing types.)
  void RegisterBool(const std::string& name, bool* prop);
  void RegisterConstBool(const std::string& name, const bool* prop);
  void RegisterWriteOnlyBool(const std::string& name, bool* prop);
  void RegisterInt16(const std::string& name, int16_t* prop);
  void RegisterConstInt16(const std::string& name, const int16_t* prop);
  void RegisterWriteOnlyInt16(const std::string& name, int16_t* prop);
  void RegisterInt32(const std::string& name, int32_t* prop);
  void RegisterConstInt32(const std::string& name, const int32_t* prop);
  void RegisterWriteOnlyInt32(const std::string& name, int32_t* prop);
  void RegisterUint32(const std::string& name, uint32_t* prop);
  void RegisterConstUint32(const std::string& name, const uint32_t* prop);
  void RegisterString(const std::string& name, std::string* prop);
  void RegisterConstString(const std::string& name, const std::string* prop);
  void RegisterWriteOnlyString(const std::string& name, std::string* prop);
  void RegisterStringmap(const std::string& name, Stringmap* prop);
  void RegisterConstStringmap(const std::string& name, const Stringmap* prop);
  void RegisterWriteOnlyStringmap(const std::string& name, Stringmap* prop);
  void RegisterStringmaps(const std::string& name, Stringmaps* prop);
  void RegisterConstStringmaps(const std::string& name, const Stringmaps* prop);
  void RegisterWriteOnlyStringmaps(const std::string& name, Stringmaps* prop);
  void RegisterStrings(const std::string& name, Strings* prop);
  void RegisterConstStrings(const std::string& name, const Strings* prop);
  void RegisterWriteOnlyStrings(const std::string& name, Strings* prop);
  void RegisterUint8(const std::string& name, uint8_t* prop);
  void RegisterConstUint8(const std::string& name, const uint8_t* prop);
  void RegisterWriteOnlyUint8(const std::string& name, uint8_t* prop);
  void RegisterUint16(const std::string& name, uint16_t* prop);
  void RegisterUint16s(const std::string& name, Uint16s* prop);
  void RegisterConstUint16(const std::string& name, const uint16_t* prop);
  void RegisterConstUint16s(const std::string& name, const Uint16s* prop);
  void RegisterWriteOnlyUint16(const std::string& name, uint16_t* prop);
  void RegisterByteArray(const std::string& name, ByteArray* prop);
  void RegisterConstByteArray(const std::string& name, const ByteArray* prop);
  void RegisterWriteOnlyByteArray(const std::string& name, ByteArray* prop);

  void RegisterDerivedBool(const std::string& name, BoolAccessor accessor);
  void RegisterDerivedInt32(const std::string& name, Int32Accessor accessor);
  void RegisterDerivedKeyValueStore(const std::string& name,
                                    KeyValueStoreAccessor accessor);
  void RegisterDerivedRpcIdentifier(const std::string& name,
                                    RpcIdentifierAccessor acc);
  void RegisterDerivedRpcIdentifiers(const std::string& name,
                                     RpcIdentifiersAccessor accessor);
  void RegisterDerivedString(const std::string& name, StringAccessor accessor);
  void RegisterDerivedStringmap(const std::string& name,
                                StringmapAccessor accessor);
  void RegisterDerivedStringmaps(const std::string& name,
                                 StringmapsAccessor accessor);
  void RegisterDerivedStrings(const std::string& name,
                              StringsAccessor accessor);
  void RegisterDerivedUint16(const std::string& name, Uint16Accessor accessor);
  void RegisterDerivedUint64(const std::string& name, Uint64Accessor accessor);
  void RegisterDerivedUint16s(const std::string& name,
                              Uint16sAccessor accessor);
  void RegisterDerivedByteArray(const std::string& name,
                                ByteArrayAccessor accessor);

 private:
  template <class V>
  bool GetProperty(const std::string& name,
                   V* value,
                   Error* error,
                   const AccessorMap<V>& collection,
                   const std::string& value_type_english) const;

  template <class V>
  bool SetProperty(const std::string& name,
                   const V& value,
                   Error* error,
                   AccessorMap<V>* collection,
                   const std::string& value_type_english);

  // These are std::maps instead of something cooler because the common
  // operation is iterating through them and returning all properties.
  std::map<std::string, BoolAccessor> bool_properties_;
  std::map<std::string, Int16Accessor> int16_properties_;
  std::map<std::string, Int32Accessor> int32_properties_;
  std::map<std::string, KeyValueStoreAccessor> key_value_store_properties_;
  std::map<std::string, RpcIdentifierAccessor> rpc_identifier_properties_;
  std::map<std::string, RpcIdentifiersAccessor> rpc_identifiers_properties_;
  std::map<std::string, StringAccessor> string_properties_;
  std::map<std::string, StringmapAccessor> stringmap_properties_;
  std::map<std::string, StringmapsAccessor> stringmaps_properties_;
  std::map<std::string, StringsAccessor> strings_properties_;
  std::map<std::string, Uint8Accessor> uint8_properties_;
  std::map<std::string, ByteArrayAccessor> bytearray_properties_;
  std::map<std::string, Uint16Accessor> uint16_properties_;
  std::map<std::string, Uint16sAccessor> uint16s_properties_;
  std::map<std::string, Uint32Accessor> uint32_properties_;
  std::map<std::string, Uint64Accessor> uint64_properties_;

  PropertyChangeCallback property_changed_callback_;
};

}  // namespace shill

#endif  // SHILL_PROPERTY_STORE_H_
