// Copyright 2022 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/local_state/local_state_utils.h"

#include <string>
#include <vector>

#include "base/json/json_writer.h"
#include "base/strings/string_util.h"
#include "base/values.h"
#include "build/build_config.h"
#include "components/prefs/pref_service.h"
#include "extensions/buildflags/buildflags.h"

namespace local_state_utils {
namespace {

// Returns true if |pref_name| starts with one of the |valid_prefixes|.
bool HasValidPrefix(const std::string& pref_name,
                    const std::vector<std::string> valid_prefixes) {
  for (const std::string& prefix : valid_prefixes) {
    if (base::StartsWith(pref_name, prefix, base::CompareCase::SENSITIVE)) {
      return true;
    }
  }
  return false;
}

base::Value::List GetPrefsMetadata(
    PrefValueStore::PrefStoreType pref_value_store_type) {
  base::Value::List metadata;
  switch (pref_value_store_type) {
    case PrefValueStore::PrefStoreType::MANAGED_STORE:
      metadata.Append("managed");
      break;
    case PrefValueStore::PrefStoreType::SUPERVISED_USER_STORE:
      metadata.Append("managed_by_custodian");
      break;
    case PrefValueStore::PrefStoreType::EXTENSION_STORE:
#if BUILDFLAG(ENABLE_EXTENSIONS)
      metadata.Append("extension_controlled");
      metadata.Append("extension_modifiable");
#else
      NOTREACHED();
#endif
      break;
    case PrefValueStore::PrefStoreType::STANDALONE_BROWSER_STORE:
#if BUILDFLAG(IS_CHROMEOS_ASH)
      metadata.Append("standalone_browser_controlled");
      metadata.Append("standalone_browser_modifiable");
#endif
      metadata.Append("extension_modifiable");
      break;
    case PrefValueStore::PrefStoreType::COMMAND_LINE_STORE:
      metadata.Append("command_line_controlled");
#if BUILDFLAG(ENABLE_EXTENSIONS)
      metadata.Append("extension_modifiable");
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
      metadata.Append("standalone_browser_modifiable");
#endif
      break;
    case PrefValueStore::PrefStoreType::USER_STORE:
      metadata.Append("user_controlled");
      metadata.Append("user_modifiable");
#if BUILDFLAG(ENABLE_EXTENSIONS)
      metadata.Append("extension_modifiable");
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
      metadata.Append("standalone_browser_modifiable");
#endif
      break;
    case PrefValueStore::PrefStoreType::RECOMMENDED_STORE:
      metadata.Append("recommended");
      metadata.Append("user_modifiable");
#if BUILDFLAG(ENABLE_EXTENSIONS)
      metadata.Append("extension_modifiable");
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
      metadata.Append("standalone_browser_modifiable");
#endif
      break;
    case PrefValueStore::PrefStoreType::DEFAULT_STORE:
      metadata.Append("default");
      metadata.Append("user_modifiable");
#if BUILDFLAG(ENABLE_EXTENSIONS)
      metadata.Append("extension_modifiable");
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
      metadata.Append("standalone_browser_modifiable");
#endif
      break;
    case PrefValueStore::PrefStoreType::INVALID_STORE:
      metadata.Append("user_modifiable");
#if BUILDFLAG(ENABLE_EXTENSIONS)
      metadata.Append("extension_modifiable");
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
      metadata.Append("standalone_browser_modifiable");
#endif
      break;
  }
  return metadata;
}

}  // namespace

std::optional<std::string> GetPrefsAsJson(
    PrefService* pref_service,
    const std::vector<std::string>& accepted_prefixes) {
  std::vector<PrefService::PreferenceValueAndStore> values =
      pref_service->GetPreferencesValueAndStore();

  base::Value::Dict local_state_values;
  for (const auto& [name, value, pref_value_store_type] : values) {
    // Filter out the prefs to only include variations and UMA related fields,
    // which don't contain PII.
    if (!accepted_prefixes.empty() &&
        !HasValidPrefix(name, accepted_prefixes)) {
      continue;
    }

    base::Value::Dict pref_details;
    pref_details.Set("value", value.Clone());
    pref_details.Set("metadata", GetPrefsMetadata(pref_value_store_type));
    local_state_values.SetByDottedPath(name, std::move(pref_details));
  }

  std::string result;
  if (!base::JSONWriter::WriteWithOptions(
          local_state_values, base::JSONWriter::OPTIONS_PRETTY_PRINT,
          &result)) {
    return std::nullopt;
  }
  return result;
}

}  // namespace local_state_utils
