/**
 * Проверяет доступность navigator.mediaDevices API
 *
 * API может быть недоступен если:
 * - Браузер не поддерживает MediaDevices API
 * - Сайт открыт без HTTPS (кроме localhost)
 * - В браузере отключены медиа-возможности
 *
 * @returns true если API доступен, иначе false
 */
export function isMediaDevicesSupported(): boolean {
  return !!(
    navigator &&
    navigator.mediaDevices &&
    navigator.mediaDevices.getUserMedia
  );
}

/**
 * Безопасная обертка для доступа к MediaDevices API
 *
 * @param callback - функция, которая использует navigator.mediaDevices
 * @param onError - опциональный обработчик ошибки
 * @returns результат callback или undefined при ошибке
 */
export async function safeMediaDeviceAccess<T>(
  callback: () => Promise<T>,
  onError?: (error: Error) => void
): Promise<T | undefined> {
  if (!isMediaDevicesSupported()) {
    const error = new Error(
      "navigator.mediaDevices недоступен. Возможно, требуется HTTPS или поддержка браузера."
    );
    console.error(error.message);
    onError?.(error);
    return undefined;
  }

  try {
    return await callback();
  } catch (error) {
    console.error("Ошибка при работе с MediaDevices:", error);
    if (onError && error instanceof Error) {
      onError(error);
    }
    return undefined;
  }
}
