export const formatResetTime = (timestamp) => { try { const resetDate = new Date(timestamp); const now = new Date(); const isToday = resetDate.toDateString() === now.toDateString(); if (isToday) { return resetDate.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' }); } return resetDate.toLocaleString(undefined, { month: 'short', day: 'numeric', weekday: 'short', hour: 'numeric', minute: '2-digit' }); } catch { return null; } }; export const calculateResetAfterSeconds = (resetAt) => { if (!resetAt) return null; const delta = Math.floor((resetAt - Date.now()) / 1000); return delta < 0 ? 0 : delta; }; export const toUsageWindow = ({ usedPercent, windowSeconds, resetAt, valueLabel }) => { const resetAfterSeconds = calculateResetAfterSeconds(resetAt); const resetFormatted = resetAt ? formatResetTime(resetAt) : null; return { usedPercent, remainingPercent: usedPercent !== null ? Math.max(0, 100 - usedPercent) : null, windowSeconds: windowSeconds ?? null, resetAfterSeconds, resetAt, resetAtFormatted: resetFormatted, resetAfterFormatted: resetFormatted, ...(valueLabel ? { valueLabel } : {}) }; }; export const buildResult = ({ providerId, providerName, ok, configured, usage, error }) => ({ providerId, providerName, ok, configured, usage: usage ?? null, ...(error ? { error } : {}), fetchedAt: Date.now() }); export const durationToLabel = (duration, unit) => { if (!duration || !unit) return 'limit'; if (unit === 'TIME_UNIT_MINUTE') return `${duration}m`; if (unit === 'TIME_UNIT_HOUR') return `${duration}h`; if (unit === 'TIME_UNIT_DAY') return `${duration}d`; return 'limit'; }; export const durationToSeconds = (duration, unit) => { if (!duration || !unit) return null; if (unit === 'TIME_UNIT_MINUTE') return duration * 60; if (unit === 'TIME_UNIT_HOUR') return duration * 3600; if (unit === 'TIME_UNIT_DAY') return duration * 86400; return null; }; export const formatMoney = (value) => { if (typeof value !== 'number' || !Number.isFinite(value)) return null; return value.toFixed(2); };