// Escala unidades segun magnitud: m | h Xm | D Xh | S XD | M XS.
// <1 minuto cae como "0m" para mantener la unidad mas pequena coherente.
const MIN = 60_000;
const HOUR = 60 * MIN;
const DAY = 24 * HOUR;
const WEEK = 7 * DAY;
const MONTH = 30 * DAY;

/**
 * Formatea una duracion en milisegundos a string humano escalado.
 *
 * Escala: m | h Xm | D Xh | S XD | M XS.
 * NaN, Infinity o negativo retornan "0m".
 */
export function formatDuration(ms: number): string {
  if (!Number.isFinite(ms) || ms < 0) return "0m";
  if (ms < HOUR) return `${Math.floor(ms / MIN)}m`;
  if (ms < DAY) {
    const h = Math.floor(ms / HOUR);
    const m = Math.floor((ms % HOUR) / MIN);
    return m === 0 ? `${h}h` : `${h}h ${m}m`;
  }
  if (ms < WEEK) {
    const d = Math.floor(ms / DAY);
    const h = Math.floor((ms % DAY) / HOUR);
    return h === 0 ? `${d}D` : `${d}D ${h}h`;
  }
  if (ms < MONTH) {
    const w = Math.floor(ms / WEEK);
    const d = Math.floor((ms % WEEK) / DAY);
    return d === 0 ? `${w}S` : `${w}S ${d}D`;
  }
  const m = Math.floor(ms / MONTH);
  const w = Math.floor((ms % MONTH) / WEEK);
  return w === 0 ? `${m}M` : `${m}M ${w}S`;
}
