// 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 "verilog/tools/kythe/indexing_facts_tree.h"

#include <algorithm>
#include <iostream>

#include "absl/memory/memory.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include "absl/strings/str_join.h"
#include "common/util/range.h"
#include "common/util/tree_operations.h"

namespace verilog {
namespace kythe {

Anchor::Anchor(const Anchor& other)
    : content_(other.content_), source_text_range_(other.source_text_range_) {}

std::string Anchor::DebugString() const {
  if (source_text_range_) {
    return absl::StrCat("{", Text(), " @", source_text_range_->begin, "-",
                        source_text_range_->begin + source_text_range_->length,
                        "}");
  }
  return absl::StrCat("{", Text(), "}");
}

std::ostream& operator<<(std::ostream& stream, const Anchor& anchor) {
  return stream << anchor.DebugString();
}

bool Anchor::operator==(const Anchor& rhs) const {
  if (source_text_range_) {
    if (!rhs.source_text_range_) {
      return false;
    }
    if (std::tie(source_text_range_->begin, source_text_range_->length) !=
        std::tie(rhs.source_text_range_->begin,
                 rhs.source_text_range_->length)) {
      return false;
    }
  }
  return Text() == rhs.Text();
}

std::ostream& IndexingNodeData::DebugString(std::ostream* stream) const {
  *stream << indexing_fact_type_ << ": ["
          << absl::StrJoin(anchors_.begin(), anchors_.end(), ", ",
                           [](std::string* out, const Anchor& anchor) {
                             absl::StrAppend(out, anchor.DebugString());
                           })
          << ']';
  return *stream;
}

std::ostream& operator<<(std::ostream& stream, const IndexingNodeData& data) {
  const auto& anchors(data.Anchors());
  return stream << data.GetIndexingFactType() << ": ["
                << absl::StrJoin(anchors.begin(), anchors.end(), ", ",
                                 absl::StreamFormatter())
                << ']';
}

bool IndexingNodeData::operator==(const IndexingNodeData& rhs) const {
  return indexing_fact_type_ == rhs.GetIndexingFactType() &&
         anchors_.size() == rhs.Anchors().size() &&
         std::equal(anchors_.begin(), anchors_.end(), rhs.Anchors().begin());
}

std::ostream& operator<<(std::ostream& stream,
                         const PrintableIndexingNodeData& printable_node) {
  return printable_node.data.DebugString(&stream);
}

std::ostream& operator<<(std::ostream& stream,
                         const PrintableIndexingFactNode& printable_node) {
  return PrintTree(
      printable_node.data, &stream,
      [&printable_node](std::ostream& s,
                        const IndexingNodeData& d) -> std::ostream& {
        return s << PrintableIndexingNodeData(d, printable_node.base);
      });
}

}  // namespace kythe
}  // namespace verilog
