// Copyright 2014 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/user_manager/fake_user_manager.h"

#include <memory>

#include "components/account_id/account_id.h"
#include "components/user_manager/fake_user_manager_delegate.h"
#include "components/user_manager/test_helper.h"
#include "components/user_manager/user.h"
#include "components/user_manager/user_type.h"

namespace user_manager {

FakeUserManager::FakeUserManager(PrefService* local_state)
    : UserManagerImpl(std::make_unique<FakeUserManagerDelegate>(),
                      local_state) {}

FakeUserManager::~FakeUserManager() = default;

std::string FakeUserManager::GetFakeUsernameHash(const AccountId& account_id) {
  return TestHelper::GetFakeUsernameHash(account_id);
}

void FakeUserManager::UserLoggedIn(const AccountId& account_id,
                                   const std::string& username_hash) {
  // Please keep the implementation in sync with
  // FakeChromeUserManager::UserLoggedIn. We're in process to merge.
  for (auto& user : user_storage_) {
    if (user->GetAccountId() == account_id) {
      user->set_is_logged_in(true);
      user->set_username_hash(username_hash);
      logged_in_users_.push_back(user.get());
      if (!primary_user_) {
        primary_user_ = user.get();
      }
      if (!active_user_) {
        active_user_ = user.get();
      }
      break;
    }
  }

  NotifyOnLogin();
}

bool FakeUserManager::EnsureUser(const AccountId& account_id,
                                 UserType user_type,
                                 bool is_ephemeral) {
  NOTREACHED();
}

void FakeUserManager::SwitchActiveUser(const AccountId& account_id) {
  for (UserList::const_iterator it = logged_in_users_.begin();
       it != logged_in_users_.end(); ++it) {
    if ((*it)->GetAccountId() == account_id) {
      active_user_ = (*it).get();
      break;
    }
  }

  if (active_user_ != nullptr) {
    NotifyActiveUserChanged(active_user_);
  }
}

}  // namespace user_manager
