// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/update_client/test_activity_data_service.h"

#include <set>
#include <string>
#include <vector>

#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/run_loop.h"
#include "base/task/sequenced_task_runner.h"
#include "base/test/bind.h"
#include "components/update_client/persisted_data.h"

namespace update_client {

namespace {
constexpr int kUnknown = -2;
}  // namespace

namespace test {

void SetDateLastData(PersistedData* metadata,
                     const std::vector<std::string>& ids,
                     int daynum) {
  base::RunLoop loop;
  metadata->SetDateLastData(ids, daynum, loop.QuitClosure());
  loop.Run();
}

bool GetActiveBit(PersistedData* metadata, const std::string& id) {
  base::RunLoop loop;
  bool result = false;
  metadata->GetActiveBits(
      {id},
      base::BindLambdaForTesting([&](const std::set<std::string>& actives) {
        result = actives.find(id) != actives.end();
        loop.QuitClosure().Run();
      }));
  loop.Run();
  return result;
}

}  // namespace test

TestActivityDataService::TestActivityDataService() = default;
TestActivityDataService::~TestActivityDataService() = default;

bool TestActivityDataService::GetActiveBit(const std::string& id) const {
  const auto& it = actives_.find(id);
  return it != actives_.end() ? it->second : false;
}

void TestActivityDataService::GetActiveBits(
    const std::vector<std::string>& ids,
    base::OnceCallback<void(const std::set<std::string>&)> callback) const {
  std::set<std::string> actives;
  for (const auto& id : ids) {
    auto it = actives_.find(id);
    if (it != actives_.end() && it->second)
      actives.insert(id);
  }
  base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
      FROM_HERE, base::BindOnce(std::move(callback), actives));
}

void TestActivityDataService::GetAndClearActiveBits(
    const std::vector<std::string>& ids,
    base::OnceCallback<void(const std::set<std::string>&)> callback) {
  std::set<std::string> actives;
  for (const auto& id : ids) {
    if (actives_.count(id) > 0 && actives_.at(id))
      actives.insert(id);
    actives_[id] = false;
  }
  base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
      FROM_HERE, base::BindOnce(std::move(callback), actives));
}

int TestActivityDataService::GetDaysSinceLastActive(
    const std::string& id) const {
  const auto& it = days_since_last_actives_.find(id);
  return it != days_since_last_actives_.end() ? it->second : kUnknown;
}

int TestActivityDataService::GetDaysSinceLastRollCall(
    const std::string& id) const {
  const auto& it = days_since_last_rollcalls_.find(id);
  return it != days_since_last_rollcalls_.end() ? it->second : kUnknown;
}

void TestActivityDataService::SetActiveBit(const std::string& id, bool value) {
  actives_[id] = value;
}

void TestActivityDataService::SetDaysSinceLastActive(const std::string& id,
                                                     int daynum) {
  days_since_last_actives_[id] = daynum;
}

void TestActivityDataService::SetDaysSinceLastRollCall(const std::string& id,
                                                       int daynum) {
  days_since_last_rollcalls_[id] = daynum;
}

}  // namespace update_client
