// Copyright 2016 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 "components/prefs/command_line_pref_store.h"

#include <memory>
#include <string>

#include "base/files/file_path.h"
#include "base/strings/string_number_conversions.h"

CommandLinePrefStore::CommandLinePrefStore(
    const base::CommandLine* command_line)
    : command_line_(command_line) {}

CommandLinePrefStore::~CommandLinePrefStore() {}

void CommandLinePrefStore::ApplyStringSwitches(
    const CommandLinePrefStore::SwitchToPreferenceMapEntry string_switch[],
    size_t size) {
  for (size_t i = 0; i < size; ++i) {
    if (command_line_->HasSwitch(string_switch[i].switch_name)) {
      SetValue(string_switch[i].preference_path,
               std::make_unique<base::Value>(command_line_->GetSwitchValueASCII(
                   string_switch[i].switch_name)),
               WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
    }
  }
}

void CommandLinePrefStore::ApplyPathSwitches(
    const CommandLinePrefStore::SwitchToPreferenceMapEntry path_switch[],
    size_t size) {
  for (size_t i = 0; i < size; ++i) {
    if (command_line_->HasSwitch(path_switch[i].switch_name)) {
      SetValue(path_switch[i].preference_path,
               std::make_unique<base::Value>(
                   command_line_->GetSwitchValuePath(path_switch[i].switch_name)
                       .value()),
               WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
    }
  }
}

void CommandLinePrefStore::ApplyIntegerSwitches(
    const CommandLinePrefStore::SwitchToPreferenceMapEntry integer_switch[],
    size_t size) {
  for (size_t i = 0; i < size; ++i) {
    if (command_line_->HasSwitch(integer_switch[i].switch_name)) {
      std::string str_value =
          command_line_->GetSwitchValueASCII(integer_switch[i].switch_name);
      int int_value = 0;
      if (!base::StringToInt(str_value, &int_value)) {
        LOG(ERROR) << "The value " << str_value << " of "
                   << integer_switch[i].switch_name
                   << " can not be converted to integer, ignoring!";
        continue;
      }
      SetValue(integer_switch[i].preference_path,
               std::make_unique<base::Value>(int_value),
               WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
    }
  }
}

void CommandLinePrefStore::ApplyBooleanSwitches(
    const CommandLinePrefStore::BooleanSwitchToPreferenceMapEntry
        boolean_switch_map[],
    size_t size) {
  for (size_t i = 0; i < size; ++i) {
    if (command_line_->HasSwitch(boolean_switch_map[i].switch_name)) {
      SetValue(boolean_switch_map[i].preference_path,
               std::make_unique<base::Value>(boolean_switch_map[i].set_value),
               WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
    }
  }
}
