// 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.

#ifndef VERIBLE_COMMON_STRINGS_DIFF_H_
#define VERIBLE_COMMON_STRINGS_DIFF_H_

#include <iosfwd>
#include <vector>

#include "absl/strings/string_view.h"
#include "common/strings/position.h"
#include "external_libs/editscript.h"

namespace verible {

// The LineDiffs structure holds line-based views of two texts
// and the edit sequence (diff) to go from 'before_text' to 'after_text'.
// No string copying is done, and the caller is responsible for ensuring
// that the externally owned string memory outlives this object.
//
// Usage:
//   LineDiffs diffs(old_text, new_text);
//
struct LineDiffs {
  const absl::string_view before_text;
  const absl::string_view after_text;
  const std::vector<absl::string_view> before_lines;  // lines
  const std::vector<absl::string_view> after_lines;   // lines
  const diff::Edits edits;  // line difference/edit-sequence between texts.

  // Computes the line-difference between before_text and after_text.
  LineDiffs(absl::string_view before_text, absl::string_view after_text);

  std::ostream &PrintEdit(std::ostream &, const diff::Edit &) const;
};

// Prints a monolithic single-hunk unified-diff.
std::ostream &operator<<(std::ostream &, const LineDiffs &diffs);

// Translates diff::Edits to an interval-set representation.
// diff::Edits are 0-indexed, but the returned line numbers will be 1-indexed.
LineNumberSet DiffEditsToAddedLineNumbers(const diff::Edits &);

// Divides a single edit-sequence (that covers two whole sequences) into
// subsequences of of edits ("patch hunks") that skip over unchanged sections.
// 'edits' must be a well-formed edit sequence, where the start and end
// indices line up and form contiguous range that span two sequences
// that were diff'd (e.g. output of diff::GetTokenDiffs()).
// 'common_context' is the number of lines of common context to pad before and
// after each hunk.  This is used to determine subsequence cut points.
//
// Example:
//   {DELETE, 0, 1}     // delete one line
//   {EQUALS, 1, 100}   // unchanged
//   {INSERT, 99, 100}  // add one line
//   with 2 elements of common context
//
// splits into two hunks:
//   {DELETE, 0, 1}     // delete one line
//   {EQUALS, 1, 3}     // unchanged
//
//   {EQUALS, 98, 100}  // unchanged
//   {INSERT, 99, 100}  // add one line
//
// This function could be upstreamed to the editscript library because it is
// agnostic to the type being diff-ed.
std::vector<diff::Edits> DiffEditsToPatchHunks(const diff::Edits &edits,
                                               int common_context);

void LineDiffsToUnifiedDiff(std::ostream &stream, const LineDiffs &linediffs,
                            unsigned common_context,
                            absl::string_view file_a = {},
                            absl::string_view file_b = {});

}  // namespace verible

#endif  // VERIBLE_COMMON_STRINGS_DIFF_H_
