'use strict';
import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';
import { AudioDevicesInfo, PermissionStatus } from '../system/types';

type OptionsMap = { [key: string]: string | boolean | number | undefined };
type NotificationOpResponse = { success: boolean; error?: string };
type NotificationType = 'playback' | 'recording' | 'simple';
type AudioFocusType =
  | 'gain'
  | 'gainTransient'
  | 'gainTransientExclusive'
  | 'gainTransientMayDuck';

interface Spec extends TurboModule {
  install(): boolean;
  getDevicePreferredSampleRate(): number;
  isFfmpegEnabled(): boolean;

  // AVAudioSession management
  setAudioSessionActivity(enabled: boolean): Promise<void>;
  setAudioSessionOptions(
    category: string,
    mode: string,
    options: Array<string>,
    allowHaptics: boolean,
    notifyOthersOnDeactivation: boolean
  ): void;
  disableSessionManagement(): void;

  // system events and interruptions
  observeAudioInterruptions(focusType: AudioFocusType, enabled: boolean): void;
  activelyReclaimSession(enabled: boolean): void;
  observeVolumeChanges(enabled: boolean): void;

  // Permissions
  requestRecordingPermissions(): Promise<PermissionStatus>;
  checkRecordingPermissions(): Promise<PermissionStatus>;
  requestNotificationPermissions(): Promise<PermissionStatus>;
  checkNotificationPermissions(): Promise<PermissionStatus>;

  // Audio devices
  getDevicesInfo(): Promise<AudioDevicesInfo>;
  setInputDevice(deviceId: string): Promise<void>;

  // Notification system
  showNotification(
    type: NotificationType,
    key: string,
    options: OptionsMap
  ): Promise<NotificationOpResponse>;
  hideNotification(key: string): Promise<NotificationOpResponse>;
  isNotificationActive(key: string): Promise<boolean>;
  // Android-only: reads bundled asset bytes and returns a Base64 string.
  readAndroidReleaseAssetBytesAsBase64(assetPath: string): Promise<string>;
}

const NativeAudioAPIModule = TurboModuleRegistry.get<Spec>('AudioAPIModule')!;

export { NativeAudioAPIModule };
