// Copyright (c) 2014 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_PERSISTENT_INTEGER_H_
#define METRICS_PERSISTENT_INTEGER_H_

#include <stdint.h>

#include <string>

#include <base/callback_forward.h>
#include <base/files/file_path.h>
#include <base/strings/string_piece.h>

namespace chromeos_metrics {

// PersistentIntegers is a 64-bit integer value backed by a file.
// The in-memory value acts as a write-through cache of the file value.
// If the backing file doesn't exist or has bad content, the value is 0.

class PersistentInteger {
 public:
  // |backing_file_path| is the path to a file that is created, read and
  // written in order to preserves the integer value across restarts of the
  // program using it.  The directory of the file must exist.
  explicit PersistentInteger(const base::FilePath& backing_file_path);
  PersistentInteger(const PersistentInteger&) = delete;
  PersistentInteger& operator=(const PersistentInteger&) = delete;

  // Virtual only because of mock.
  virtual ~PersistentInteger();

  // Sets the value.  This writes through to the backing file.
  void Set(int64_t v);

  // Gets the value.  May sync from backing file first.
  int64_t Get();

  // Convenience function for Get() followed by Set(0).
  // Virtual only because of mock.
  virtual int64_t GetAndClear();

  // Convenience function for v = Get, Set(v + x).
  // Virtual only because of mock.
  virtual void Add(int64_t x);

  // Convenience function for v = Get, Set(max(v, x)).
  // Virtual only because of mock.
  virtual void Max(int64_t x);

  // Set a callback that is called each time a PersistentInteger is created.
  static void SetCreationCallbackForTesting(
      const base::RepeatingCallback<void(const base::FilePath&)>&
          creation_callback);
  static void ClearCreationCallbackForTesting();

 private:
  static const int kVersion = 1001;

  // Writes |value_| to the backing file, creating it if necessary.
  void Write();

  // Reads the value from the backing file, stores it in |value_|, and returns
  // true if the backing file is valid.  Returns false otherwise, and creates
  // a valid backing file as a side effect.
  bool Read();

  base::FilePath path_;
  bool synced_;
  int64_t value_;
  int32_t version_;

  static bool testing_;
};

}  // namespace chromeos_metrics

#endif  // METRICS_PERSISTENT_INTEGER_H_
