// 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 COBALT_UTIL_CONSISTENT_PROTO_STORE_H_
#define COBALT_UTIL_CONSISTENT_PROTO_STORE_H_

#include <google/protobuf/message_lite.h>
#include <memory>
#include <string>

#include "util/file_system.h"
#include "util/status.h"

namespace cobalt {
namespace util {

// ConsistentProtoStore is a persistent store of a single protocol buffer
// message that guarantees consistent updates.
class ConsistentProtoStore {
 public:
  // Constructs a ConsistentProtoStore
  //
  // |filename| the fully qualified path of the file to store data in.
  // |fs| is used for detecting the presence of, renaming, and deleting files.
  explicit ConsistentProtoStore(std::string filename,
                                std::unique_ptr<FileSystem> fs);

  // Writes |proto| to the store, overwriting any previously written proto.
  // Consistency is guaranteed in that if the operation fails, the previously
  // written proto will not have been corrupted and may be read via the Read()
  // method.
  Status Write(const google::protobuf::MessageLite &proto);

  // Reads the previously written proto into |proto|.
  //
  // A failure either means that no proto has ever been written, or that the
  // data is corrupt (does not represent a valid protocol buffer).
  Status Read(google::protobuf::MessageLite *proto);

 protected:
  virtual Status WriteToTmp(const google::protobuf::MessageLite &proto);
  virtual Status MoveTmpToOverride();
  virtual Status DeletePrimary();
  virtual Status MoveOverrideToPrimary();

  // Primary file is the base filename used for all operations. It is the
  // filename that is passed into the constructor.
  const std::string primary_file_;

  // Temporary file name. It will never be used during a Read() operation.
  const std::string tmp_file_;

  // Overrides primary_file_. If there is data in override_file_, it will be
  // read instead of primary_file_.
  const std::string override_file_;

  std::unique_ptr<FileSystem> fs_;
};

}  // namespace util
}  // namespace cobalt

#endif  // COBALT_UTIL_CONSISTENT_PROTO_STORE_H_
