// Copyright (c) 2012 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 <string>
#include <vector>

#include <base/callback.h>
#include <base/macros.h>

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

namespace shill {

class Error;

class PropertyStore {
 public:
  typedef base::Callback<void(const std::string &)> PropertyChangeCallback;
  PropertyStore();
  explicit PropertyStore(PropertyChangeCallback property_change_callback);
  virtual ~PropertyStore();

  virtual bool Contains(const std::string& property) 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 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 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<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 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 RegisterDerivedBool(const std::string &name,
                           const BoolAccessor &accessor);
  void RegisterDerivedInt32(const std::string &name,
                            const Int32Accessor &accessor);
  void RegisterDerivedKeyValueStore(const std::string &name,
                                    const KeyValueStoreAccessor &accessor);
  void RegisterDerivedRpcIdentifier(const std::string &name,
                                    const RpcIdentifierAccessor &acc);
  void RegisterDerivedRpcIdentifiers(const std::string &name,
                                     const RpcIdentifiersAccessor &accessor);
  void RegisterDerivedString(const std::string &name,
                             const StringAccessor &accessor);
  void RegisterDerivedStringmap(const std::string &name,
                                const StringmapAccessor &accessor);
  void RegisterDerivedStringmaps(const std::string &name,
                                 const StringmapsAccessor &accessor);
  void RegisterDerivedStrings(const std::string &name,
                              const StringsAccessor &accessor);
  void RegisterDerivedUint16(const std::string &name,
                             const Uint16Accessor &accessor);
  void RegisterDerivedUint64(const std::string &name,
                             const Uint64Accessor &accessor);

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

  template <class V>
  bool SetProperty(
      const std::string &name,
      const V &value,
      Error *error,
      std::map<std::string, std::shared_ptr<AccessorInterface<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, 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_
