// Copyright 2014 The Chromium 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 "chrome/browser/chromeos/login/users/mock_user_manager.h"

#include "base/task_runner.h"
#include "chrome/browser/chromeos/login/users/fake_supervised_user_manager.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"

namespace {

class FakeTaskRunner : public base::TaskRunner {
 public:
  bool PostDelayedTask(const base::Location& from_here,
                       base::OnceClosure task,
                       base::TimeDelta delay) override {
    std::move(task).Run();
    return true;
  }
  bool RunsTasksInCurrentSequence() const override { return true; }

 protected:
  ~FakeTaskRunner() override {}
};

}  // namespace

namespace chromeos {

MockUserManager::MockUserManager()
    : ChromeUserManager(new FakeTaskRunner()),
      user_flow_(new DefaultUserFlow()),
      supervised_user_manager_(new FakeSupervisedUserManager()) {
  ProfileHelper::SetProfileToUserForTestingEnabled(true);
}

MockUserManager::~MockUserManager() {
  ProfileHelper::SetProfileToUserForTestingEnabled(false);
  ClearUserList();
}

const user_manager::UserList& MockUserManager::GetUsers() const {
  return user_list_;
}

user_manager::UserList MockUserManager::GetUnlockUsers() const {
  return user_list_;
}

const AccountId& MockUserManager::GetOwnerAccountId() const {
  return GetActiveUser()->GetAccountId();
}

const user_manager::User* MockUserManager::GetActiveUser() const {
  return user_list_.empty() ? nullptr : user_list_.front();
}

user_manager::User* MockUserManager::GetActiveUser() {
  return user_list_.empty() ? nullptr : user_list_.front();
}

const user_manager::User* MockUserManager::GetPrimaryUser() const {
  return GetActiveUser();
}

MultiProfileUserController* MockUserManager::GetMultiProfileUserController() {
  return nullptr;
}

UserImageManager* MockUserManager::GetUserImageManager(
    const AccountId& account_id) {
  return nullptr;
}

SupervisedUserManager* MockUserManager::GetSupervisedUserManager() {
  return supervised_user_manager_.get();
}

// Creates a new User instance.
void MockUserManager::SetActiveUser(const AccountId& account_id) {
  ClearUserList();
  AddUser(account_id);
}

UserFlow* MockUserManager::GetCurrentUserFlow() const {
  return user_flow_.get();
}

UserFlow* MockUserManager::GetUserFlow(const AccountId&) const {
  return user_flow_.get();
}

user_manager::User* MockUserManager::CreatePublicAccountUser(
    const AccountId& account_id) {
  ClearUserList();
  user_manager::User* user =
      user_manager::User::CreatePublicAccountUser(account_id);
  user_list_.push_back(user);
  ProfileHelper::Get()->SetProfileToUserMappingForTesting(user);
  return user_list_.back();
}

user_manager::User* MockUserManager::CreateKioskAppUser(
    const AccountId& account_id) {
  ClearUserList();
  user_list_.push_back(user_manager::User::CreateKioskAppUser(account_id));
  ProfileHelper::Get()->SetProfileToUserMappingForTesting(user_list_.back());
  return user_list_.back();
}

void MockUserManager::AddUser(const AccountId& account_id) {
  AddUserWithAffiliation(account_id, false);
}

void MockUserManager::AddUserWithAffiliation(const AccountId& account_id,
                                             bool is_affiliated) {
  user_manager::User* user = user_manager::User::CreateRegularUser(
      account_id, user_manager::USER_TYPE_REGULAR);
  user->SetAffiliation(is_affiliated);
  user_list_.push_back(user);
  ProfileHelper::Get()->SetProfileToUserMappingForTesting(user);
}

void MockUserManager::ClearUserList() {
  // Can't use STLDeleteElements because of the protected destructor of User.
  for (user_manager::UserList::iterator user = user_list_.begin();
       user != user_list_.end(); ++user)
    delete *user;
  user_list_.clear();
}

bool MockUserManager::ShouldReportUser(const std::string& user_id) const {
  for (auto* user : user_list_) {
    if (user->GetAccountId().GetUserEmail() == user_id)
      return user->IsAffiliated();
  }
  NOTREACHED();
  return false;
}

}  // namespace chromeos
