#ifndef PRODUCTION_BORG_MGMT_NODE_PROXY_SAFEPOWER_SAFEPOWER_AGENT_BMC_PERSISTENT_STORAGE_BMC_H_
#define PRODUCTION_BORG_MGMT_NODE_PROXY_SAFEPOWER_SAFEPOWER_AGENT_BMC_PERSISTENT_STORAGE_BMC_H_

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

#include "persistent_storage.h"
#include "safepower_agent_config.pb.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 {
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";

class PersistentStorageManagerBMC
    : public safepower_agent::PersistentStorageManager {
 public:
  explicit PersistentStorageManagerBMC(
      const safepower_agent_config::PersistentStorageConfig& config =
          safepower_agent_config::PersistentStorageConfig::default_instance());

  ~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);
  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);

  std::string dir_path_{kRWFSPath};
  std::uintmax_t max_file_size_ = kMaxFileSize;
  uint32_t proto_keep_number_ = kProtoKeepNumber;
};

}  // namespace persistent_storage

#endif  // PRODUCTION_BORG_MGMT_NODE_PROXY_SAFEPOWER_SAFEPOWER_AGENT_BMC_PERSISTENT_STORAGE_BMC_H_
