/*
 * A forma de onda de um áudio para a trilha da linha do tempo: 20 alturas
 * por segundo (0 a 100), medidas do próprio arquivo no navegador.
 */
export async function ondaDoAudio(bruto: ArrayBuffer): Promise<{ duracao: number; onda: number[] } | null> {
  const contexto = new OfflineAudioContext(1, 48000, 48000);
  const som = await contexto.decodeAudioData(bruto.slice(0)).catch(() => null);
  if (!som) return null;
  const canal = som.getChannelData(0);
  const pontos = Math.max(40, Math.min(1200, Math.round(som.duration * 20)));
  const passo = Math.max(1, Math.floor(canal.length / pontos));
  const picos = Array.from({ length: pontos }, (_, k) => {
    let p = 0;
    for (let i = k * passo; i < Math.min(canal.length, (k + 1) * passo); i += 8) p = Math.max(p, Math.abs(canal[i]));
    return p;
  });
  const maior = Math.max(...picos, 1e-6);
  return { duracao: Math.round(som.duration * 100) / 100, onda: picos.map((p) => Math.round((p / maior) * 100)) };
}
