import { cleanDoc, normDateStr, toUTCms } from './helpers.mjs'; // Parsea una línea (nombres preservados) export function parseLine(line) { const raw = String(line || '').replace(/\r/g, '').trim(); if (!raw) return null; // omitir encabezado if (/^no[\t ]|^mchn[\t ]|^enno[\t ]|^name[\t ]|^datetime[\t ]/i.test(raw)) return null; let parts = raw.split(/\t+/); // Si no alcanzan 7 campos, intentar fallback con dos o más espacios if (parts.length < 7) { const dtMatch = raw.match(/(\d{2,4}[\/-]\d{1,2}[\/-]\d{1,2})\s+(\d{1,2}:\d{2}:\d{2})$/); if (dtMatch) { const head = raw.slice(0, dtMatch.index).trim(); const headParts = head.split(/\t+|\s{2,}/).filter(Boolean); parts = [...headParts, dtMatch[1], dtMatch[2]]; } else { parts = raw.split(/\s{2,}/).filter(Boolean); } } if (parts.length < 7) return null; // 0:No, 1:Mchn, 2:EnNo(doc), 3:Name, 4:Mode, 5:Fecha, 6:Hora const DOC_IDX = 2; const NAME_IDX = 3; const MODE_IDX = 4; const doc = cleanDoc(parts[DOC_IDX]); const name = String(parts[NAME_IDX] || '').trim(); const mode = String(parts[MODE_IDX] || '').trim(); let dateStr = String(parts[5] || '').trim(); let timeStr = String(parts[6] || '').trim(); // Caso: 7 columnas y última es "DateTime" const last = parts[parts.length - 1]; const dtBoth = /(\d{2,4}[\/-]\d{1,2}[\/-]\d{1,2})\s+(\d{1,2}:\d{2}:\d{2})/.exec(last); if (dtBoth) { dateStr = dtBoth[1]; timeStr = dtBoth[2]; } else if (!timeStr && /\d{1,2}:\d{2}:\d{2}/.test(dateStr)) { const m = dateStr.match(/^(.+?)\s+(\d{1,2}:\d{2}:\d{2})$/); if (m) { dateStr = m[1]; timeStr = m[2]; } } const iso = normDateStr(dateStr); // YY/MM/DD o YYYY/MM/DD -> YYYY-MM-DD if (!iso || !/^\d{1,2}:\d{2}:\d{2}$/.test(timeStr)) return null; const [H, M, S] = timeStr.split(':').map(n => parseInt(n, 10)); // mantener construcción local solo por paridad con el snippet original // eslint-disable-next-line no-unused-vars const dt = new Date(`${iso}T${String(H).padStart(2,'0')}:${String(M).padStart(2,'0')}:${String(S).padStart(2,'0')}`); return { doc, name, isoDate: iso, time: timeStr, dt_ms: toUTCms(iso, timeStr), // ⬅️ clave mode }; }