// ============================================================
// 音频编码工具
// 职责：将浏览器采集的音频数据编码为 Base64 PCM 格式
// ============================================================

/**
 * 将 Float32Array 音频样本编码为 Base64 PCM 16kHz 字符串
 * 用于 WebSocket query 消息的 audio 字段
 */
export function encodeAudioToBase64(samples: Float32Array): string {
  // Float32 -> Int16 PCM
  const buffer = new ArrayBuffer(samples.length * 2);
  const view = new DataView(buffer);

  for (let i = 0; i < samples.length; i++) {
    const s = Math.max(-1, Math.min(1, samples[i]));
    view.setInt16(i * 2, s < 0 ? s * 0x8000 : s * 0x7fff, true);
  }

  // ArrayBuffer -> Base64
  const bytes = new Uint8Array(buffer);
  let binary = "";
  for (let i = 0; i < bytes.length; i++) {
    binary += String.fromCharCode(bytes[i]);
  }
  return btoa(binary);
}

/**
 * 将 Base64 音频数据解码为可用于播放的 Blob URL
 * 用于 TTS 音频播放
 */
export function decodeBase64Audio(base64: string, mimeType: string): string {
  const binary = atob(base64);
  const bytes = new Uint8Array(binary.length);
  for (let i = 0; i < binary.length; i++) {
    bytes[i] = binary.charCodeAt(i);
  }
  const blob = new Blob([bytes], { type: mimeType });
  return URL.createObjectURL(blob);
}

/**
 * 将 JPEG DataURL 转换为纯 Base64（去掉 data:image/jpeg;base64, 前缀）
 * 用于 WebSocket query 消息的 image 字段
 */
export function dataUrlToBase64(dataUrl: string): string {
  const commaIndex = dataUrl.indexOf(",");
  return commaIndex >= 0 ? dataUrl.substring(commaIndex + 1) : dataUrl;
}
