// Copyright 2020 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 DLCSERVICE_PREFS_H_
#define DLCSERVICE_PREFS_H_

#include <string>

#include <base/files/file_path.h>

#include "dlcservice/boot/boot_slot.h"
#include "dlcservice/dlc.h"

namespace dlcservice {

extern const char kDlcPrefVerified[];

// |Prefs| class can be used to persist key value pairs to disk.
class Prefs {
 public:
  // Initializes prefs with root as |prefs_root|.
  explicit Prefs(const base::FilePath& prefs_root);

  // Initializes prefs starting path using |SystemState::dlc_prefs_dir()| with
  // |DlcBase|'s DLC ID and |BootSlot::Slot|.
  Prefs(const DlcBase& dlc, BootSlot::Slot slot);

  // Sets the given |value| for |key|, creating the |key| if it did not exist.
  bool SetKey(const std::string& key, const std::string& value);

  // Gets the given |key|'s value into |value|. Returns false if |key| did not
  // exist.
  bool GetKey(const std::string& key, std::string* value);

  // Creates the given |key| with empty value.
  bool Create(const std::string& key);

  // Returns true if the |key| exists.
  bool Exists(const std::string& key);

  // Removes the |key|.
  bool Delete(const std::string& key);

 private:
  base::FilePath prefs_root_;
};

}  // namespace dlcservice

#endif  // DLCSERVICE_PREFS_H_
