import { makeFixes } from './make-fixes.js'
var NODE_DEPENDENT_ON_RIGHT = 'nodeDependentOnRight'
var RIGHT = 'right'
var RIGHT_GROUP = 'rightGroup'
var LEFT = 'left'
var LEFT_GROUP = 'leftGroup'
var MISSED_COMMENT_ABOVE = 'missedCommentAbove'
var ORDER_ERROR = `Expected "{{${RIGHT}}}" to come before "{{${LEFT}}}".`
var DEPENDENCY_ORDER_ERROR = `Expected dependency "{{${RIGHT}}}" to come before "{{${NODE_DEPENDENT_ON_RIGHT}}}".`
var GROUP_ORDER_ERROR = `Expected "{{${RIGHT}}}" ({{${RIGHT_GROUP}}}) to come before "{{${LEFT}}}" ({{${LEFT_GROUP}}}).`
var EXTRA_SPACING_ERROR = `Extra spacing between "{{${LEFT}}}" and "{{${RIGHT}}}".`
var MISSED_SPACING_ERROR = `Missed spacing between "{{${LEFT}}}" and "{{${RIGHT}}}".`
var MISSED_COMMENT_ABOVE_ERROR = `Missed comment "{{${MISSED_COMMENT_ABOVE}}}" above "{{${RIGHT}}}".`
/**
 * Reports ESLint errors with contextual data and auto-fix support.
 *
 * Generates ESLint error reports for each provided message ID, including:
 *
 * - Contextual data for error messages (element names, groups, dependencies)
 * - Auto-fix function that applies all necessary corrections
 * - Node location for error highlighting.
 *
 * The function supports dynamic message templates with placeholders that are
 * replaced with actual values:
 *
 * - {{left}} / {{right}} - Element names in the comparison
 * - {{leftGroup}} / {{rightGroup}} - Group names
 * - {{nodeDependentOnRight}} - Name of dependent element
 * - {{missedCommentAbove}} - Missing comment text.
 *
 * @example
 *
 * ```ts
 * // Reporting import order violation
 * reportErrors({
 *   messageIds: ['unexpectedOrder'],
 *   left: { name: 'useState', group: 'react' },
 *   right: { name: 'React', group: 'react' },
 *   // Error: "Expected 'React' to come before 'useState'"
 * })
 * ```
 *
 * @example
 *
 * ```ts
 * // Reporting dependency violation in TypeScript interfaces
 * reportErrors({
 * messageIds: ['unexpectedDependencyOrder'],
 * right: { name: 'User', ... },
 * firstUnorderedNodeDependentOnRight: { name: 'AdminUser extends User', ... },
 * // Error: "Expected 'User' to come before 'AdminUser extends User' due to dependency"
 * });
 * ```
 *
 * @example
 *
 * ```ts
 * // Reporting missing newlines between import groups
 * reportErrors({
 *   messageIds: ['missedSpacingBetweenMembers'],
 *   left: { name: 'React', group: 'external' },
 *   right: { name: './utils', group: 'internal' },
 *   // Error: "Expected newline between external and internal imports"
 * })
 * ```
 *
 * @template MessageIds - Union of message IDs.
 * @template T - Type of sorting node.
 * @param params - Parameters for error reporting.
 */
function reportErrors({
  firstUnorderedNodeDependentOnRight,
  ignoreFirstNodeHighestBlockComment,
  newlinesBetweenValueGetter,
  commentAboveMissing,
  sortedNodes,
  messageIds,
  sourceCode,
  context,
  options,
  nodes,
  right,
  left,
}) {
  for (let messageId of messageIds) {
    context.report({
      data: {
        [NODE_DEPENDENT_ON_RIGHT]: firstUnorderedNodeDependentOnRight?.name,
        [MISSED_COMMENT_ABOVE]: commentAboveMissing,
        [LEFT]: toSingleLine(left?.name ?? ''),
        [RIGHT]: toSingleLine(right.name),
        [RIGHT_GROUP]: right.group,
        [LEFT_GROUP]: left?.group,
      },
      fix: fixer =>
        makeFixes({
          hasCommentAboveMissing: !!commentAboveMissing,
          ignoreFirstNodeHighestBlockComment,
          newlinesBetweenValueGetter,
          sortedNodes,
          sourceCode,
          options,
          fixer,
          nodes,
        }),
      node: right.node,
      messageId,
    })
  }
}
/**
 * Converts multi-line strings to single-line for error messages.
 *
 * Normalizes element names that may span multiple lines (like template
 * literals, multi-line imports, or complex expressions) into a single line
 * format suitable for error messages.
 *
 * @example
 *
 * ```ts
 * toSingleLine(`
 * import {
 * Component
 * } from 'react'
 * `)
 * // Returns: "import { Component } from 'react'"
 * ```
 *
 * @param string - Multi-line string to normalize.
 * @returns Single-line string with normalized whitespace.
 */
function toSingleLine(string) {
  return string.replaceAll(/\s{2,}/gu, ' ').trim()
}
export {
  DEPENDENCY_ORDER_ERROR,
  EXTRA_SPACING_ERROR,
  GROUP_ORDER_ERROR,
  LEFT,
  MISSED_COMMENT_ABOVE_ERROR,
  MISSED_SPACING_ERROR,
  ORDER_ERROR,
  RIGHT,
  reportErrors,
}
