import { ParseMode } from "../appstore/" function mergeSkuQuantities( rows: { sku: string; qty: number }[] ): { sku: string; qty: number }[] { if (!rows || rows.length === 0) return []; const seen = new Map() return rows.reduce<{ sku: string; qty: number }[]>((acc, { sku, qty }) => { if (seen.has(sku)) { // update existing entry’s qty const idx = seen.get(sku)! acc[idx].qty += qty } else { // push new entry, remember its index acc.push({ sku, qty }); seen.set(sku, acc.length - 1); } return acc }, []) } /** * Parse CSV/TSV content into SKU-quantity pairs * Detects delimiter automatically (comma or tab) */ export function parseCSVOrTSV(input: string, mode: ParseMode): { sku: string; qty: number }[] { const trimmed = input.trim(); // Auto-detect delimiter: check first line const firstLine = trimmed.split(/\r?\n/)[0]; const delimiter = firstLine.includes('\t') ? '\t' : ','; return parseWithDelimiter(trimmed, delimiter, mode); } function parseWithDelimiter(input: string, delimiter: string, mode: ParseMode): { sku: string; qty: number }[] { let rows = input .trim() .split(/\r?\n/) .map(line => line.trim()) .filter(Boolean) // skip empty rows .map(r => r.split(delimiter)) .map(([sku, qty]) => [sku?.trim(), qty?.trim()]) .filter( r => r.length === 2 && r[0].trim().length > 0 ); // only two-columns with non-empty if (rows.length === 0) return []; switch (mode) { case "full": // Drop first row (headers), keep the rest rows = rows.slice(1); break; case "selection": // Use all rows as-is (assume no headers) break; case "auto": const [, firstQty] = rows[0]; if (isNaN(Number(firstQty))) { rows = rows.slice(1) ;// drop header } break; } return mergeSkuQuantities(rows .map(([sku, qty]) => { const parsedQty = Number(qty); return { sku: sku.trim(), qty: isNaN(parsedQty) ? 0 : parsedQty, } })) }