// Copyright 2018 The Fuchsia 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 "fidl/findings_json.h"

namespace fidl {

void FindingsJson::Generate(const Finding& finding) {
  GenerateObject([&]() {
    GenerateObjectMember("category", "fidl-lint/" + finding.subcategory(), Position::kFirst);
    GenerateObjectMember("message", finding.message());
    // TODO(FIDL-668) Add "url" to related FIDL documentation, per Tricium spec
    Generate(finding.span());
    std::vector<SuggestionWithReplacementSpan> suggestions;
    if (finding.suggestion().has_value()) {
      suggestions.emplace_back(
          SuggestionWithReplacementSpan{finding.span(), finding.suggestion().value()});
    }
    GenerateObjectMember("suggestions", suggestions);
  });
}

void FindingsJson::Generate(const SuggestionWithReplacementSpan& suggestion_with_span) {
  auto& suggestion = suggestion_with_span.suggestion;
  auto& span = suggestion_with_span.span;
  GenerateObject([&]() {
    GenerateObjectMember("description", suggestion.description(), Position::kFirst);
    std::vector<Replacement> replacements;
    if (suggestion.replacement().has_value()) {
      replacements.emplace_back(Replacement{span, suggestion.replacement().value()});
    }
    GenerateObjectMember("replacements", replacements);
  });
}

void FindingsJson::Generate(const Replacement& replacement) {
  GenerateObject([&]() {
    GenerateObjectMember("replacement", replacement.replacement, Position::kFirst);
    Generate(replacement.span);
  });
}

void FindingsJson::Generate(const SourceSpan& span) {
  GenerateObjectMember("path", span.source_file().filename());

  auto start = span.data();
  auto end = span.data();
  end.remove_prefix(start.size());

  auto end_span = SourceSpan(end, span.source_file());

  SourceFile::Position start_position = span.position();
  SourceFile::Position end_position = end_span.position();

  GenerateObjectMember("start_line", static_cast<uint32_t>(start_position.line));
  GenerateObjectMember("start_char", static_cast<uint32_t>(start_position.column - 1));
  GenerateObjectMember("end_line", static_cast<uint32_t>(end_position.line));
  GenerateObjectMember("end_char", static_cast<uint32_t>(end_position.column - 1));
}

std::ostringstream FindingsJson::Produce() {
  ResetIndentLevel();

  GenerateArray(findings_);

  return std::move(json_file_);
}

}  // namespace fidl
