const PRIORITIES = new Set(['LOW', 'NORMAL', 'HIGH', 'CRITICAL']); export function createTicket({ id, summary, priority = 'NORMAL', requestedAt }) { if (!id || !summary?.trim() || !requestedAt || !PRIORITIES.has(priority)) { throw new Error('invalid ticket input'); } return { id, summary: summary.trim(), priority, requestedAt, status: 'OPEN', assignee: null, resolvedAt: null }; } export function assignTicket(ticket, assignee) { if (!assignee?.trim() || !['OPEN', 'ASSIGNED'].includes(ticket.status)) { throw new Error('ticket cannot be assigned'); } return { ...ticket, assignee: assignee.trim(), status: 'ASSIGNED' }; } export function resolveTicket(ticket, resolvedAt) { if (ticket.status !== 'ASSIGNED' || !resolvedAt) throw new Error('ticket cannot be resolved'); return { ...ticket, status: 'RESOLVED', resolvedAt }; } export function isSlaBreached(ticket, now) { const targetHours = ticket.priority === 'CRITICAL' ? 1 : ticket.priority === 'HIGH' ? 4 : 24; const elapsed = new Date(now).getTime() - new Date(ticket.requestedAt).getTime(); return ticket.status !== 'RESOLVED' && elapsed > targetHours * 60 * 60 * 1000; }