#ifndef PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_PERSISTENT_STORAGE_BMC_H_
#define PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_PERSISTENT_STORAGE_BMC_H_

#include <cstdint>
#include <string>
#include <vector>

#include "persistent_storage.h"
#include "state_persistence.pb.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "absl/types/span.h"

namespace persistent_storage {
// b/359687259 make kRWFSPath and size configurable
constexpr std::uintmax_t kMaxFileSize = 16384;  // 16 k
constexpr absl::string_view kRWFSPath = "/var/google/gPowerD/SavedActions/";
constexpr uint32_t kProtoKeepNumber = 10;

constexpr absl::string_view kfileNamePrefix = "savedactions";

struct PersistentStorageManagerBMC
    : public safepower_agent::PersistentStorageManager {
 public:
  ~PersistentStorageManagerBMC() override = default;

  // Writes a delta to the saved actions to persistent storage.
  absl::Status WriteSavedActionsChange(
      const safepower_agent_persistence_proto::SavedActions& actions) override;

  absl::Status WriteSavedActionsChange(
      const safepower_agent_persistence_proto::SavedActions& actions,
      absl::string_view dir_path);

  // Reads all saved actions from persistent storage.
  absl::StatusOr<safepower_agent_persistence_proto::SavedActions>
  ReadSavedActions() override;

  absl::StatusOr<safepower_agent_persistence_proto::SavedActions>
  ReadSavedActions(absl::string_view dir_path);
 private:
  absl::Status ConvertAppendToMap(
    safepower_agent_persistence_proto::SavedActions& map,
    safepower_agent_persistence_proto::SavedActionAppendLog& log);

  // keep the most recent protos is called when the size of the saved files is
  // larger then the kmaxFileSize. In the event of large protos we will always
  // have at least kProtoKeepNumber of messages. That garuantees was more
  // important then miniziains the file size. From a design perspective it would
  // be ideal if kMaxFileSize was reached at 2*kProtoKeepNumber, but that is not
  // necessary.
  absl::Status keepMostRecentProtos(
      safepower_agent_persistence_proto::SavedActions& map,
      uint32_t keepNumber = kProtoKeepNumber);
  absl::StatusOr<uint64_t> findLargestFileId(
      absl::Span<const std::string> files);
  absl::StatusOr<std::vector<std::string> >
      listFiles(absl::string_view file_path);
  absl::Status deleteAllFilesExceptLargest(absl::string_view file_path);
  std::string MakeFileName(absl::string_view file_path, uint64_t file_id);
};

}  // namespace persistent_storage

#endif  // PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_PERSISTENT_STORAGE_BMC_H_
