// Copyright 2021 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 METRICS_STRUCTURED_PERSISTENT_PROTO_H_
#define METRICS_STRUCTURED_PERSISTENT_PROTO_H_

#include <memory>
#include <string>
#include <utility>

#include <base/check.h>
#include <base/files/file_path.h>
#include <base/macros.h>
#include <base/memory/scoped_refptr.h>
#include <base/optional.h>
#include <base/time/time.h>

namespace metrics {
namespace structured {

// PersistentProto wraps a proto class and persists it to disk. Usage summary:
//  - pproto->Method() will call Method on the underlying proto.
//  - Call Write() to write to disk.
//
// Reading. The backing file is read from disk once at initialization. If no
// proto file exists on disk, or it is invalid, a blank proto is constructed
// and immediately written to disk.
//
// Writing. Writes must be triggered manually by calling |Write|.
//
// WARNING. Every proto this class can be used with needs to be listed at the
// bottom of the cc file.
template <class T>
class PersistentProto {
 public:
  explicit PersistentProto(const std::string& path);
  ~PersistentProto();

  PersistentProto(const PersistentProto&) = delete;
  PersistentProto& operator=(const PersistentProto&) = delete;

  T* get() { return proto_.get(); }

  T* operator->() {
    CHECK(proto_);
    return proto_.get();
  }

  T operator*() {
    CHECK(proto_);
    return *proto_;
  }

  constexpr bool has_value() const { return proto_.get() != nullptr; }

  constexpr explicit operator bool() const { return has_value(); }

  void Write();

 private:
  void OnQueueWrite();

  // Path on disk to read from and write to.
  const std::string path_;

  // The proto itself.
  std::unique_ptr<T> proto_;
};

}  // namespace structured
}  // namespace metrics

#endif  // METRICS_STRUCTURED_PERSISTENT_PROTO_H_
