// 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/supervised_user/supervised_user_pref_store.h"

#include <vector>

#include "base/bind.h"
#include "base/prefs/pref_value_map.h"
#include "base/values.h"
#include "chrome/browser/prefs/incognito_mode_prefs.h"
#include "chrome/browser/supervised_user/supervised_user_constants.h"
#include "chrome/browser/supervised_user/supervised_user_settings_service.h"
#include "chrome/browser/supervised_user/supervised_user_url_filter.h"
#include "chrome/common/pref_names.h"

using base::FundamentalValue;

namespace {

struct SupervisedUserSettingsPrefMappingEntry {
  const char* settings_name;
  const char* pref_name;
};

SupervisedUserSettingsPrefMappingEntry kSupervisedUserSettingsPrefMapping[] = {
  {
    supervised_users::kContentPackDefaultFilteringBehavior,
    prefs::kDefaultSupervisedUserFilteringBehavior,
  },
  {
    supervised_users::kContentPackManualBehaviorHosts,
    prefs::kSupervisedUserManualHosts,
  },
  {
    supervised_users::kContentPackManualBehaviorURLs,
    prefs::kSupervisedUserManualURLs,
  },
  {
    supervised_users::kForceSafeSearch, prefs::kForceSafeSearch,
  },
  {
    supervised_users::kRecordHistory, prefs::kRecordHistory,
  },
  {
    supervised_users::kSigninAllowed, prefs::kSigninAllowed,
  },
  {
    supervised_users::kUserName, prefs::kProfileName,
  },
};

}  // namespace

SupervisedUserPrefStore::SupervisedUserPrefStore(
    SupervisedUserSettingsService* supervised_user_settings_service)
    : weak_ptr_factory_(this) {
  supervised_user_settings_service->Subscribe(
      base::Bind(&SupervisedUserPrefStore::OnNewSettingsAvailable,
                 weak_ptr_factory_.GetWeakPtr()));
}

bool SupervisedUserPrefStore::GetValue(const std::string& key,
                                       const base::Value** value) const {
  DCHECK(prefs_);
  return prefs_->GetValue(key, value);
}

void SupervisedUserPrefStore::AddObserver(PrefStore::Observer* observer) {
  observers_.AddObserver(observer);
}

void SupervisedUserPrefStore::RemoveObserver(PrefStore::Observer* observer) {
  observers_.RemoveObserver(observer);
}

bool SupervisedUserPrefStore::HasObservers() const {
  return observers_.might_have_observers();
}

bool SupervisedUserPrefStore::IsInitializationComplete() const {
  return !!prefs_;
}

SupervisedUserPrefStore::~SupervisedUserPrefStore() {
}

void SupervisedUserPrefStore::OnNewSettingsAvailable(
    const base::DictionaryValue* settings) {
  scoped_ptr<PrefValueMap> old_prefs = prefs_.Pass();
  prefs_.reset(new PrefValueMap);
  if (settings) {
    // Set hardcoded prefs.
    prefs_->SetValue(prefs::kAllowDeletingBrowserHistory,
                     new FundamentalValue(false));
    prefs_->SetValue(prefs::kDefaultSupervisedUserFilteringBehavior,
                     new FundamentalValue(SupervisedUserURLFilter::ALLOW));
    prefs_->SetValue(prefs::kForceSafeSearch, new FundamentalValue(true));
    prefs_->SetValue(prefs::kRecordHistory, new FundamentalValue(true));
    prefs_->SetValue(prefs::kHideWebStoreIcon, new FundamentalValue(true));
    prefs_->SetValue(prefs::kIncognitoModeAvailability,
                     new FundamentalValue(IncognitoModePrefs::DISABLED));
    prefs_->SetValue(prefs::kSigninAllowed, new FundamentalValue(false));

    // Copy supervised user settings to prefs.
    for (size_t i = 0; i < arraysize(kSupervisedUserSettingsPrefMapping); ++i) {
      const SupervisedUserSettingsPrefMappingEntry& entry =
          kSupervisedUserSettingsPrefMapping[i];
      const base::Value* value = NULL;
      if (settings->GetWithoutPathExpansion(entry.settings_name, &value))
        prefs_->SetValue(entry.pref_name, value->DeepCopy());
    }
  }

  if (!old_prefs) {
    FOR_EACH_OBSERVER(Observer, observers_, OnInitializationCompleted(true));
    return;
  }

  std::vector<std::string> changed_prefs;
  prefs_->GetDifferingKeys(old_prefs.get(), &changed_prefs);

  // Send out change notifications.
  for (const std::string& pref : changed_prefs) {
    FOR_EACH_OBSERVER(Observer, observers_, OnPrefValueChanged(pref));
  }
}
