/*
 * SPDX-FileCopyrightText: 2023 The HedgeDoc developers (see AUTHORS file)
 *
 * SPDX-License-Identifier: AGPL-3.0-only
 */
import type { StructuredPatchHunk, StructuredPatch } from 'diff'

/**
 * Inverts a given unified patch.
 * A patch that e.g. adds a line, will remove it then.
 *
 * @param structuredPatch The patch to invert
 * @return The inverted patch
 */
export const invertUnifiedPatch = (structuredPatch: StructuredPatch): StructuredPatch => {
  const { oldFileName, newFileName, oldHeader, newHeader, hunks, index } = structuredPatch

  const newHunks: StructuredPatchHunk[] = hunks.map((hunk) => {
    const { oldLines, oldStart, newLines, newStart, lines } = hunk
    return {
      oldLines: newLines,
      oldStart: newStart,
      newLines: oldLines,
      newStart: oldStart,
      lines: lines.map((line) => {
        if (line.startsWith('-')) {
          return `+${line.slice(1)}`
        } else if (line.startsWith('+')) {
          return `-${line.slice(1)}`
        } else {
          return line
        }
      })
    }
  })

  return {
    hunks: newHunks,
    index: index,
    newFileName: oldFileName,
    newHeader: oldHeader,
    oldFileName: newFileName,
    oldHeader: newHeader
  }
}
