// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "pdf/parsed_params.h"

#include <string>

#include "base/strings/string_number_conversions.h"
#include "pdf/pdfium/pdfium_form_filler.h"
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/platform/web_vector.h"
#include "third_party/blink/public/web/web_plugin_params.h"

namespace chrome_pdf {

ParsedParams::ParsedParams() = default;

ParsedParams::ParsedParams(const ParsedParams& other) = default;
ParsedParams& ParsedParams::operator=(const ParsedParams& other) = default;

ParsedParams::ParsedParams(ParsedParams&& other) = default;
ParsedParams& ParsedParams::operator=(ParsedParams&& other) = default;

ParsedParams::~ParsedParams() = default;

std::optional<ParsedParams> ParseWebPluginParams(
    const blink::WebPluginParams& params) {
  ParsedParams result;
  for (size_t i = 0; i < params.attribute_names.size(); ++i) {
    if (params.attribute_names[i] == "src") {
      result.src_url = params.attribute_values[i].Utf8();
    } else if (params.attribute_names[i] == "original-url") {
      result.original_url = params.attribute_values[i].Utf8();
    } else if (params.attribute_names[i] == "top-level-url") {
      result.top_level_url = params.attribute_values[i].Utf8();
    } else if (params.attribute_names[i] == "full-frame") {
      result.full_frame = true;
    } else if (params.attribute_names[i] == "background-color") {
      if (!base::StringToUint(params.attribute_values[i].Utf8(),
                              &result.background_color)) {
        return std::nullopt;
      }
    } else if (params.attribute_names[i] == "javascript") {
      if (params.attribute_values[i] != "allow")
        result.script_option = PDFiumFormFiller::ScriptOption::kNoJavaScript;
    } else if (params.attribute_names[i] == "has-edits") {
      result.has_edits = true;
    } else if (params.attribute_names[i] == "use-skia") {
      result.use_skia = true;
    }
  }

  if (result.src_url.empty())
    return std::nullopt;

  if (result.original_url.empty())
    result.original_url = result.src_url;

  return result;
}

}  // namespace chrome_pdf
