import lavenstein from 'js-levenshtein'; import { Column, Columns, MatchColumnsStepProps, } from '@/spreadsheet-import/steps/components/MatchColumnsStep/MatchColumnsStep'; import { Field, Fields } from '@/spreadsheet-import/types'; import { isDefined } from '~/utils/isDefined'; import { findMatch } from './findMatch'; import { setColumn } from './setColumn'; export const getMatchedColumns = ( columns: Columns, fields: Fields, data: MatchColumnsStepProps['data'], autoMapDistance: number, ) => columns.reduce[]>((arr, column) => { const autoMatch = findMatch(column.header, fields, autoMapDistance); if (isDefined(autoMatch)) { const field = fields.find((field) => field.key === autoMatch) as Field; const duplicateIndex = arr.findIndex( (column) => 'value' in column && column.value === field.key, ); const duplicate = arr[duplicateIndex]; if (duplicate && 'value' in duplicate) { return lavenstein(duplicate.value, duplicate.header) < lavenstein(autoMatch, column.header) ? [ ...arr.slice(0, duplicateIndex), setColumn(arr[duplicateIndex], field, data), ...arr.slice(duplicateIndex + 1), setColumn(column), ] : [ ...arr.slice(0, duplicateIndex), setColumn(arr[duplicateIndex]), ...arr.slice(duplicateIndex + 1), setColumn(column, field, data), ]; } else { return [...arr, setColumn(column, field, data)]; } } else { return [...arr, column]; } }, []);