/**
 * Safari-specific audio utilities for handling MediaRecorder and AudioContext compatibility
 */

export const isSafari = (): boolean => {
  return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
};

export const getSafariCompatibleMimeType = (): string | undefined => {
  if (!isSafari()) {
    return undefined;
  }

  // Safari MIME type preference order for best compatibility
  // Note: Safari has better support for MP4/AAC than WebM
  const mimeTypes = [
    'audio/mp4;codecs=aac',
    'audio/mp4',
    'audio/wav',
    'audio/webm;codecs=opus',
    'audio/ogg;codecs=opus',
    'audio/webm',
  ];

  for (const mimeType of mimeTypes) {
    if (MediaRecorder.isTypeSupported(mimeType)) {
      console.log(`Safari: Using MIME type: ${mimeType}`);
      return mimeType;
    }
  }

  console.warn('Safari: No compatible MIME type found, using default');
  return undefined;
};

export const safariDecodeAudioBuffer = async (
  arrayBuffer: ArrayBuffer
): Promise<AudioBuffer> => {
  try {
    const freshContext = new (window.AudioContext ||
      (window as any).webkitAudioContext)();
    await freshContext.resume();
    return await freshContext.decodeAudioData(arrayBuffer);
  } catch (error) {}

  try {
    const blob = new Blob([arrayBuffer]);
    const url = URL.createObjectURL(blob);

    return new Promise(() => {
      const audio = new Audio();
      audio.crossOrigin = 'anonymous';
      audio.src = url;
      audio.load();
    });
  } catch (error) {}

  throw new Error('Safari decode failed');
};
