//
// Copyright (C) 2012 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#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,
                           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);
  void RegisterDerivedUint16s(const std::string& name,
                              const Uint16sAccessor& accessor);
  void RegisterDerivedByteArray(const std::string& name,
                                const ByteArrayAccessor& 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, 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_
