// Copyright 2017-2020 The Verible Authors.
//
// 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 "common/strings/obfuscator.h"

#include <sstream>
#include <string>
#include <vector>

#include "absl/status/status.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_split.h"
#include "absl/strings/string_view.h"
#include "common/util/logging.h"

namespace verible {

bool Obfuscator::encode(absl::string_view key, absl::string_view value) {
  return translator_.insert(std::string(key), std::string(value));
}

absl::string_view Obfuscator::operator()(absl::string_view input) {
  if (decode_mode) {
    const auto* p = translator_.find_reverse(input);
    return (p != nullptr) ? *p : input;
  } else {
    const std::string* str = translator_.insert_using_value_generator(
        std::string(input), [=]() { return generator_(input); });
    return *str;
  }
}

constexpr char kPairSeparator = ' ';

std::string Obfuscator::save() const {
  std::ostringstream stream;
  for (const auto& pair : translator_.forward_view()) {
    stream << pair.first << kPairSeparator << *pair.second << std::endl;
  }
  return stream.str();
}

absl::Status Obfuscator::load(absl::string_view mapping) {
  const std::vector<absl::string_view> lines =
      absl::StrSplit(mapping, '\n', absl::SkipEmpty());
  for (const auto& line : lines) {
    const std::vector<absl::string_view> elements =
        absl::StrSplit(line, kPairSeparator);
    if (elements.size() < 2) {
      return absl::InvalidArgumentError(
          absl::StrCat("Failed to parse line:\n", line));
    }
    // elements are expected to be identifiers (original, obfuscated)
    encode(elements[0], elements[1]);
  }
  return absl::OkStatus();
}

bool IdentifierObfuscator::encode(absl::string_view key,
                                  absl::string_view value) {
  CHECK_EQ(key.length(), value.length());
  return parent_type::encode(key, value);
}

}  // namespace verible
