// Copyright 2016 The Weave 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 LIBWEAVE_SRC_ACCESS_REVOCATION_MANAGER_IMPL_H_
#define LIBWEAVE_SRC_ACCESS_REVOCATION_MANAGER_IMPL_H_

#include <set>
#include <utility>

#include <base/time/default_clock.h>
#include <base/time/time.h>
#include <weave/error.h>
#include <weave/provider/config_store.h>

#include "src/access_revocation_manager.h"

namespace weave {

class AccessRevocationManagerImpl : public AccessRevocationManager {
 public:
  explicit AccessRevocationManagerImpl(provider::ConfigStore* store,
                                       size_t capacity = 1024,
                                       base::Clock* clock = nullptr);

  // AccessRevocationManager implementation.
  void AddEntryAddedCallback(const base::Closure& callback) override;
  void Block(const Entry& entry, const DoneCallback& callback) override;
  bool IsBlocked(const std::vector<uint8_t>& user_id,
                 const std::vector<uint8_t>& app_id,
                 base::Time timestamp) const override;
  std::vector<Entry> GetEntries() const override;
  size_t GetSize() const override;
  size_t GetCapacity() const override;

 private:
  void Load();
  void Save(const DoneCallback& callback);
  void RemoveExpired();

  struct EntryIdsLess {
    bool operator()(const Entry& l, const Entry& r) const {
      auto make_tuple = [](const AccessRevocationManager::Entry& e) {
        return std::tie(e.user_id, e.app_id);
      };
      return make_tuple(l) < make_tuple(r);
    }
  };

  const size_t capacity_{0};
  base::DefaultClock default_clock_;
  base::Clock* clock_{&default_clock_};

  provider::ConfigStore* store_{nullptr};
  std::set<Entry, EntryIdsLess> entries_;
  std::vector<base::Closure> on_entry_added_callbacks_;

  DISALLOW_COPY_AND_ASSIGN(AccessRevocationManagerImpl);
};

}  // namespace weave

#endif  // LIBWEAVE_SRC_ACCESS_REVOCATION_MANAGER_IMPL_H_
