// Copyright 2018 The Fuchsia 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 SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_MAP_SETTING_STORE_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_MAP_SETTING_STORE_H_

#include <map>
#include <memory>

#include "src/developer/debug/zxdb/client/setting_store.h"
#include "src/developer/debug/zxdb/client/setting_store_observer.h"
#include "src/lib/fxl/observer_list.h"

namespace zxdb {

// An implementation of SettingStore that just stores the values in a map. This is used for
// standalone settings where there is no separate object backing the storage.
//
// This type of SettingStore also implements fallback for hierarchical settings. If a value is
// not explicitly set in the current store, it will recursively query fallback stores until a
// value is found.
class MapSettingStore : public SettingStore {
 public:
  explicit MapSettingStore(fxl::RefPtr<SettingSchema> schema, MapSettingStore* fallback = nullptr);

  SettingStore* fallback() const { return fallback_; }
  void set_fallback(MapSettingStore* fallback) { fallback_ = fallback; }

  void AddObserver(const std::string& setting_name, SettingStoreObserver*);
  void RemoveObserver(const std::string& setting_name, SettingStoreObserver*);

 protected:
  // SettingStore implementation.
  virtual SettingValue GetStorageValue(const std::string& key) const override;
  virtual Err SetStorageValue(const std::string& key, SettingValue value) override;
  virtual Err ClearStorageValue(const std::string& key) override;

 private:
  void NotifySettingChanged(const std::string& setting_name) const;

  // SettingStore this store lookup settings when it cannot find them locally. Can be null. If set,
  // must outlive |this|.
  MapSettingStore* fallback_;
  std::map<std::string, SettingValue> values_;

  std::map<std::string, fxl::ObserverList<SettingStoreObserver>> observer_map_;

  FXL_DISALLOW_COPY_AND_ASSIGN(MapSettingStore);
};

}  // namespace zxdb

#endif  // SRC_DEVELOPER_DEBUG_ZXDB_CLIENT_MAP_SETTING_STORE_H_
