// Copyright 2013 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/ui/app_list/test/fake_profile_store.h"

#include "chrome/browser/profiles/profile.h"

FakeProfileStore::FakeProfileStore(const base::FilePath& user_data_dir)
    : user_data_dir_(user_data_dir) {
}

FakeProfileStore::~FakeProfileStore() {
}

void FakeProfileStore::LoadProfile(Profile* profile) {
  loaded_profiles_[profile->GetPath()] = profile;
  CallbacksByPath::iterator it = callbacks_.find(profile->GetPath());
  if (it != callbacks_.end()) {
    it->second.Run(profile);
    callbacks_.erase(it);
  }
}

void FakeProfileStore::RemoveProfile(Profile* profile) {
  base::FilePath path(profile->GetPath());
  FOR_EACH_OBSERVER(ProfileInfoCacheObserver, observer_list_,
                    OnProfileWillBeRemoved(path));
  loaded_profiles_.erase(path);
  FOR_EACH_OBSERVER(ProfileInfoCacheObserver, observer_list_,
                    OnProfileWasRemoved(path, base::string16()));
}

void FakeProfileStore::AddProfileObserver(
    ProfileInfoCacheObserver* observer) {
  observer_list_.AddObserver(observer);
}

void FakeProfileStore::LoadProfileAsync(
    const base::FilePath& path,
    base::Callback<void(Profile*)> callback) {
  Profile* profile = GetProfileByPath(path);
  if (profile) {
    callback.Run(profile);
    return;
  }
  callbacks_[path] = callback;
}

Profile* FakeProfileStore::GetProfileByPath(
    const base::FilePath& path) {
  ProfilesByPath::const_iterator it = loaded_profiles_.find(path);
  if (it != loaded_profiles_.end())
    return it->second;
  return NULL;
}

base::FilePath FakeProfileStore::GetUserDataDir() {
  return user_data_dir_;
}

bool FakeProfileStore::IsProfileManaged(const base::FilePath& path) {
  return false;
}
