// 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/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);
  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_;

  DISALLOW_COPY_AND_ASSIGN(PropertyStore);
};

}  // namespace shill

#endif  // SHILL_PROPERTY_STORE_H_
