// Copyright (c) 2012 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.

#include "cryptohome/user_oldest_activity_timestamp_cache.h"

#include <string>
#include <utility>

#include <base/logging.h>
#include <base/time/time.h>

namespace cryptohome {

void UserOldestActivityTimestampCache::Initialize() {
  CHECK(initialized_ == false);
  initialized_ = true;
}

void UserOldestActivityTimestampCache::AddExistingUser(const std::string& user,
                                                       base::Time timestamp) {
  CHECK(initialized_);
  users_timestamp_lookup_.insert(std::make_pair(user, timestamp));
}

void UserOldestActivityTimestampCache::UpdateExistingUser(
    const std::string& user,
    base::Time timestamp) {
  CHECK(initialized_);
  users_timestamp_lookup_[user] = timestamp;
}

void UserOldestActivityTimestampCache::RemoveUser(const std::string& user) {
  CHECK(initialized_);
  users_timestamp_lookup_.erase(user);
}

base::Time UserOldestActivityTimestampCache::GetLastUserActivityTimestamp(
    const std::string& user) const {
  CHECK(initialized_);
  auto it = users_timestamp_lookup_.find(user);

  if (it == users_timestamp_lookup_.end()) {
    return base::Time();
  } else {
    return it->second;
  }
}

}  // namespace cryptohome
