// Copyright (c) 2017 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 POWER_MANAGER_COMMON_FILE_PREFS_STORE_H_
#define POWER_MANAGER_COMMON_FILE_PREFS_STORE_H_

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

#include <base/files/file_path.h>
#include <base/files/file_path_watcher.h>
#include <base/memory/linked_ptr.h>

#include "power_manager/common/prefs.h"

namespace power_manager {

// PrefsStoreInterface implementation that uses files to store preferences.
class FilePrefsStore : public PrefsStoreInterface {
 public:
  explicit FilePrefsStore(const base::FilePath& pref_path);
  ~FilePrefsStore() override = default;

  // PrefsStoreInterface:
  std::string GetDescription() const override;
  bool ReadPrefString(const std::string& name, std::string* value_out) override;
  bool WritePrefString(const std::string& name,
                       const std::string& value) override;
  bool Watch(const PrefsStoreInterface::ChangeCallback& callback) override;

 private:
  using FileWatcherMap =
      std::map<std::string, linked_ptr<base::FilePathWatcher>>;

  // Called by |dir_watcher_| and |file_watchers_|. Calls UpdateFileWatchers()
  // for directory changes or notifies |callback_| for pref file changes.
  void HandlePathChanged(const base::FilePath& dir, bool error);

  void UpdateFileWatchers();

  // Path to a directory containing pref files.
  const base::FilePath pref_path_;

  // The callback passed to Watch(). Called when preference files change.
  PrefsStoreInterface::ChangeCallback callback_;

  // Watches |pref_path_| for changes, calling HandleDirChanged().
  std::unique_ptr<base::FilePathWatcher> dir_watcher_;

  // Watches files in |pref_path_| for changes, calling HandleFileChanged().
  FileWatcherMap file_watchers_;

  DISALLOW_COPY_AND_ASSIGN(FilePrefsStore);
};

}  // namespace power_manager

#endif  // POWER_MANAGER_COMMON_FILE_PREFS_STORE_H_
