import React from 'react';
import { SwitchAudioOptions, SwitchAudioParameters } from '../../methods/streamMethods/switchAudio';
import { SwitchVideoOptions, SwitchVideoParameters } from '../../methods/streamMethods/switchVideo';
import { SwitchVideoAltOptions, SwitchVideoAltParameters } from '../../methods/streamMethods/switchVideoAlt';
/**
 * Parameters for media settings state and device management.
 *
 * @interface MediaSettingsModalParameters
 * @extends SwitchAudioParameters, SwitchVideoParameters, SwitchVideoAltParameters
 *
 * **Default Devices:**
 * @property {string} userDefaultVideoInputDevice - Currently selected video input device ID
 * @property {string} userDefaultAudioInputDevice - Currently selected audio input device ID
 *
 * **Available Devices:**
 * @property {MediaDeviceInfo[]} videoInputs - List of available video input devices (cameras)
 * @property {MediaDeviceInfo[]} audioInputs - List of available audio input devices (microphones)
 *
 * **Background Modal:**
 * @property {boolean} isBackgroundModalVisible - Whether background effects modal is visible
 * @property {function} updateIsBackgroundModalVisible - Callback to update background modal visibility
 *
 * **Utility:**
 * @property {function} getUpdatedAllParams - Function to retrieve current parameter state
 */
export interface MediaSettingsModalParameters extends SwitchAudioParameters, SwitchVideoParameters, SwitchVideoAltParameters {
    userDefaultVideoInputDevice: string;
    videoInputs: MediaDeviceInfo[];
    audioInputs: MediaDeviceInfo[];
    userDefaultAudioInputDevice: string;
    isBackgroundModalVisible: boolean;
    updateIsBackgroundModalVisible: (visible: boolean) => void;
    getUpdatedAllParams: () => MediaSettingsModalParameters;
}
/**
 * Configuration options for the MediaSettingsModal component.
 *
 * @interface MediaSettingsModalOptions
 *
 * **Modal Control:**
 * @property {boolean} isMediaSettingsModalVisible - Whether the modal is currently visible
 * @property {function} onMediaSettingsClose - Callback to close the modal
 *
 * **Device Switch Handlers:**
 * @property {function} [switchCameraOnPress=switchVideoAlt] - Handler for camera switching (front/back on mobile)
 * @property {function} [switchVideoOnPress=switchVideo] - Handler for video input device switching
 * @property {function} [switchAudioOnPress=switchAudio] - Handler for audio input device switching
 *
 * **State Parameters:**
 * @property {MediaSettingsModalParameters} parameters - Current device state and available devices
 *
 * **Customization:**
 * @property {'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'} [position='topRight'] - Modal screen position
 * @property {string} [backgroundColor='#83c0e9'] - Modal background color
 * @property {object} [style] - Additional custom styles
 *
 * **Advanced Render Overrides:**
 * @property {function} [renderContent] - Custom content renderer (receives defaultContent and dimensions)
 * @property {function} [renderContainer] - Custom container renderer (receives defaultContainer and dimensions)
 */
export interface MediaSettingsModalOptions {
    isMediaSettingsModalVisible: boolean;
    onMediaSettingsClose: () => void;
    switchCameraOnPress?: (options: SwitchVideoAltOptions) => Promise<void>;
    switchVideoOnPress?: (options: SwitchVideoOptions) => Promise<void>;
    switchAudioOnPress?: (options: SwitchAudioOptions) => Promise<void>;
    parameters: MediaSettingsModalParameters;
    position?: 'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft';
    backgroundColor?: string;
    isDarkMode?: boolean;
    renderMode?: 'modal' | 'sidebar' | 'inline';
    style?: object;
    renderContent?: (options: {
        defaultContent: JSX.Element;
        dimensions: {
            width: number;
            height: number;
        };
    }) => JSX.Element;
    renderContainer?: (options: {
        defaultContainer: JSX.Element;
        dimensions: {
            width: number;
            height: number;
        };
    }) => React.ReactNode;
}
export type MediaSettingsModalType = (options: MediaSettingsModalOptions) => JSX.Element;
/**
 * MediaSettingsModal - Audio/Video device selection interface
 *
 * MediaSettingsModal is a React Native component that provides an interface for
 * participants to select their preferred audio and video input devices. It supports
 * camera switching (front/back on mobile), microphone selection, and background
 * effects integration.
 *
 * **Key Features:**
 * - Audio input device selection (microphone)
 * - Video input device selection (camera)
 * - Camera switch button (front/back on mobile)
 * - Background effects modal integration
 * - Real-time device switching
 * - Available device enumeration
 * - Position-configurable modal (4 corners)
 *
 * **UI Customization:**
 * This component can be replaced via `uiOverrides.mediaSettingsModal` to
 * provide a completely custom media settings interface.
 *
 * @component
 * @param {MediaSettingsModalOptions} props - Configuration options for media settings
 *
 * @returns {JSX.Element} Rendered media settings modal
 *
 * @example
 * // Basic usage - Device selection
 * import React, { useState } from 'react';
 * import { MediaSettingsModal } from 'mediasfu-reactnative-expo';
 *
 * function MediaControls() {
 *   const [isModalVisible, setModalVisible] = useState(false);
 *   const [selectedCamera, setSelectedCamera] = useState('camera1');
 *   const [selectedMic, setSelectedMic] = useState('mic1');
 *
 *   const videoDevices = [
 *     { deviceId: 'camera1', label: 'Front Camera', kind: 'videoinput' },
 *     { deviceId: 'camera2', label: 'Back Camera', kind: 'videoinput' },
 *   ];
 *
 *   const audioDevices = [
 *     { deviceId: 'mic1', label: 'Built-in Microphone', kind: 'audioinput' },
 *     { deviceId: 'mic2', label: 'Bluetooth Headset', kind: 'audioinput' },
 *   ];
 *
 *   return (
 *     <>
 *       <Button title="Media Settings" onPress={() => setModalVisible(true)} />
 *       <MediaSettingsModal
 *         isMediaSettingsModalVisible={isModalVisible}
 *         onMediaSettingsClose={() => setModalVisible(false)}
 *         parameters={{
 *           userDefaultVideoInputDevice: selectedCamera,
 *           userDefaultAudioInputDevice: selectedMic,
 *           videoInputs: videoDevices,
 *           audioInputs: audioDevices,
 *           isBackgroundModalVisible: false,
 *           updateIsBackgroundModalVisible: (visible) => console.log('Background modal:', visible),
 *           getUpdatedAllParams: () => ({
 *             userDefaultVideoInputDevice: selectedCamera,
 *             userDefaultAudioInputDevice: selectedMic,
 *             videoInputs: videoDevices,
 *             audioInputs: audioDevices,
 *           }),
 *         }}
 *       />
 *     );
 *   };
 *   ```
 *
 * @example
 * ```tsx
 * // With position and background effects modal
 * const handleSwitchCamera = async (options: SwitchVideoAltOptions) => {
 *   await switchVideoAlt(options);
 *   console.log('Camera switched');
 * };
 *
 * return (
 *   <MediaSettingsModal
 *     isMediaSettingsModalVisible={showSettings}
 *     onMediaSettingsClose={() => setShowSettings(false)}
 *     switchCameraOnPress={handleSwitchCamera}
 *     parameters={mediaParameters}
 *     position="bottomLeft"
 *     backgroundColor="#2c3e50"
 *   />
 * );
 * ```
 *
 * @example
 * ```tsx
 * // Using custom UI via uiOverrides
 * const config = {
 *   uiOverrides: {
 *     mediaSettingsModal: {
 *       component: MyCustomMediaSettings,
 *       injectedProps: {
 *         theme: 'dark',
 *         showAdvancedOptions: true,
 *       },
 *     },
 *   },
 * };
 *
 * return <MyMediaComponent config={config} />;
 * ```
 */
declare const MediaSettingsModal: React.FC<MediaSettingsModalOptions>;
export default MediaSettingsModal;
