import { findMatch } from "./findMatch"
import type { Field, Fields } from "../../../types"
import { setColumn } from "./setColumn"
import type { Column, Columns, MatchColumnsProps } from "../types"

export const getMatchedColumns = <T extends string>(
  columns: Columns<T>,
  fields: Fields<T>,
  data: MatchColumnsProps<T>["data"],
  autoMapDistance: number,
  autoMapSelectValues?: boolean,
) =>
  columns.reduce<Column<T>[]>((arr, column) => {
    const autoMatch = findMatch(column.header, fields, autoMapDistance)
    if (autoMatch) {
      const field = fields.find((field) => field.key === autoMatch) as Field<T>
      const duplicateIndex = arr.findIndex((column) => "value" in column && column.value === field.key)
      if (duplicateIndex >= 0) {
        // Field already matched by an earlier column — keep the first match
        return [...arr, column]
      } else {
        return [...arr, setColumn(column, field, data, autoMapSelectValues)]
      }
    } else {
      return [...arr, column]
    }
  }, [])
