export default function parseAbsence(str, teacherMap) { str = str.trim().replace(/\s+/g, " "); const result = { teacher: null, teacherCode: null, type: null, // "wholeDay" | "range" | "single" | "invalid" hours: null }; // Patterns (teacher can be before or after the hours) const wholeDayPattern = /^([A-Za-z]+)$/; const rangePattern = /^(\d+)\s*-\s*(\d+)\s+([A-Za-z]+)$|^([A-Za-z]+)\s+(\d+)\s*-\s*(\d+)$/; const singleHourPattern = /^(\d+)\s+([A-Za-z]+)$|^([A-Za-z]+)\s+(\d+)$/; const plusPattern = /^(\d+)\+\s+([A-Za-z]+)$|^([A-Za-z]+)\s+(\d+)\+$/; if (rangePattern.test(str)) { const match = str.match(rangePattern); // Case 1: hours first, then teacher if (match[1] && match[2] && match[3]) { const [, from, to, teacherCode] = match; result.teacherCode = teacherCode; result.teacher = teacherMap[teacherCode.toLowerCase()]; result.type = "range"; result.hours = { from: parseInt(from), to: parseInt(to) }; } // Case 2: teacher first, then hours else { const [, , , teacherCode, from, to] = match; result.teacherCode = teacherCode; result.teacher = teacherMap[teacherCode.toLowerCase()]; result.type = "range"; result.hours = { from: parseInt(from), to: parseInt(to) }; } } else if (plusPattern.test(str)) { const match = str.match(plusPattern); if (match[1] && match[2]) { // hours first const [, from, teacherCode] = match; result.teacherCode = teacherCode; result.teacher = teacherMap[teacherCode.toLowerCase()]; result.type = "range"; result.hours = { from: parseInt(from), to: 10 }; } else { // teacher first const [, , teacherCode, from] = match; result.teacherCode = teacherCode; result.teacher = teacherMap[teacherCode.toLowerCase()]; result.type = "range"; result.hours = { from: parseInt(from), to: 10 }; } } else if (singleHourPattern.test(str)) { const match = str.match(singleHourPattern); if (match[1] && match[2]) { // hours first const [, hour, teacherCode] = match; result.teacherCode = teacherCode; result.teacher = teacherMap[teacherCode.toLowerCase()]; result.type = "single"; result.hours = parseInt(hour); } else { // teacher first const [, , teacherCode, hour] = match; result.teacherCode = teacherCode; result.teacher = teacherMap[teacherCode.toLowerCase()]; result.type = "single"; result.hours = parseInt(hour); } } else if (wholeDayPattern.test(str)) { const [, teacherCode] = str.match(wholeDayPattern); result.teacher = teacherMap[teacherCode.toLowerCase()]; result.teacherCode = teacherCode; result.type = "wholeDay"; } else { result.type = "invalid"; result.original = str; } return result; }