// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/webdriver/protocol/search_strategy.h"

namespace cobalt {
namespace webdriver {
namespace protocol {
namespace {

const char kUsingKey[] = "using";
const char kValueKey[] = "value";

struct StrategyStringMapping {
  SearchStrategy::Strategy strategy;
  const char* name;
};
StrategyStringMapping strategy_mapping[] = {
    {SearchStrategy::kClassName, "class name"},
    {SearchStrategy::kCssSelector, "css selector"},
    {SearchStrategy::kId, "id"},
    {SearchStrategy::kName, "name"},
    {SearchStrategy::kLinkText, "link text"},
    {SearchStrategy::kPartialLinkText, "partial link text"},
    {SearchStrategy::kTagName, "tag name"},
    {SearchStrategy::kXPath, "xpath"},
};

bool GetSearchStrategyFromString(const std::string& strategy_string,
                                 SearchStrategy::Strategy* out_strategy) {
  for (size_t i = 0; i < arraysize(strategy_mapping); ++i) {
    if (strategy_mapping[i].name == strategy_string) {
      *out_strategy = strategy_mapping[i].strategy;
      return true;
    }
  }
  return false;
}
}  // namespace

base::optional<SearchStrategy> SearchStrategy::FromValue(
    const base::Value* value) {
  const base::DictionaryValue* dictionary_value;
  if (!value->GetAsDictionary(&dictionary_value)) {
    return base::nullopt;
  }
  std::string using_strategy;
  std::string parameter;
  if (!dictionary_value->GetString(kUsingKey, &using_strategy)) {
    return base::nullopt;
  }
  if (!dictionary_value->GetString(kValueKey, &parameter)) {
    return base::nullopt;
  }
  SearchStrategy::Strategy strategy;
  if (!GetSearchStrategyFromString(using_strategy, &strategy)) {
    return base::nullopt;
  }
  return SearchStrategy(strategy, parameter);
}

}  // namespace protocol
}  // namespace webdriver
}  // namespace cobalt
