// Copyright 2018 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 AUTHPOLICY_GPO_VERSION_CACHE_H_
#define AUTHPOLICY_GPO_VERSION_CACHE_H_

#include <map>
#include <memory>
#include <string>

#include "base/time/time.h"

namespace base {
class Clock;
class FilePath;
}  // namespace base

namespace authpolicy {

namespace protos {
class DebugFlags;
}

// Simple cache that keeps track of GPO versions.
class GpoVersionCache {
 public:
  // |flags| is a non-owned pointer to DebugFlags flags (the class listens to
  // flags->log_caches() to toggle logging).
  explicit GpoVersionCache(const protos::DebugFlags* flags);
  GpoVersionCache(const GpoVersionCache&) = delete;
  GpoVersionCache& operator=(const GpoVersionCache&) = delete;

  ~GpoVersionCache();

  // Clears the cache.
  void Clear();

  // Caches the |version| of the GPO with given |key| and keeps track of the
  // time for RemoveEntriesOlderThan(). Any |key| can be used, but in practice
  // it's going to be something like "GUID-U" or "GUID-M", depending on whether
  // it's user or machine policy, where GUID is the GPO's objectGuid.
  void Add(const std::string& key, uint32_t version);

  // Removes the GPO with given |key| from the cache. Does nothing if |key| does
  // not exist.
  void Remove(const std::string& key);

  // Returns true if the GPO with given |key| is in the cache and its version
  // matches the given target |version|.
  bool MayUseCachedGpo(const std::string& key, uint32_t version);

  // Removes all cache entriers older than |max_age|.
  void RemoveEntriesOlderThan(base::TimeDelta max_age);

  // Overrides the clock used for purging old cache entries.
  void SetClockForTesting(std::unique_ptr<base::Clock> clock);

  base::Clock* clock() { return clock_.get(); }

  // Turns the cache on or off. While set to false, MayUseCachedGpo() always
  // returns false and Add() and Remove() do nothing.
  void SetEnabled(bool enabled) { enabled_ = enabled; }
  bool IsEnabled() const { return enabled_; }

  int cache_hits_for_testing() const { return cache_hits_for_testing_; }
  int cache_misses_for_testing() const { return cache_misses_for_testing_; }

 private:
  struct CacheEntry {
    uint32_t version;       // GPO version (user/machine depending on scope).
    base::Time cache_time;  // Time when Add() was called last.
  };

  // Maps GPO path to CacheEntry.
  std::map<std::string, CacheEntry> cache_;

  // Pointer to debug flags, not owned.
  const protos::DebugFlags* flags_;

  // Clock to get cache time, can be overridden for tests.
  std::unique_ptr<base::Clock> clock_;

  // While set to false, MayUseCachedGpo() always returns false and Add and
  // Remove do nothing.
  bool enabled_ = true;

  // Counters for the number of times MayUseCachedGpo() returns true (hits) and
  // false (misses) for testing.
  int cache_hits_for_testing_ = 0;
  int cache_misses_for_testing_ = 0;
};

}  // namespace authpolicy

#endif  // AUTHPOLICY_GPO_VERSION_CACHE_H_
