// Disable no-unused-vars, broken for spread args
/* eslint no-unused-vars: off */
import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron';
import { LoadAudioBufferArgs } from '../ipc/types';
import AudioChannels from '../ipc/channels';
// import '../ipc/file/preload'; // Import file API preload to ensure it runs and exposes the API

export type Channels = 'ipc-example';

const electronHandler = {
  ipcRenderer: {
    sendMessage(channel: Channels, ...args: unknown[]) {
      ipcRenderer.send(channel, ...args);
    },
    on(channel: Channels, func: (...args: unknown[]) => void) {
      const subscription = (_event: IpcRendererEvent, ...args: unknown[]) =>
        func(...args);
      ipcRenderer.on(channel, subscription);

      return () => {
        ipcRenderer.removeListener(channel, subscription);
      };
    },
    once(channel: Channels, func: (...args: unknown[]) => void) {
      ipcRenderer.once(channel, (_event, ...args) => func(...args));
    },

    invoke: (event: string, ...args: unknown[]) =>
      ipcRenderer.invoke(event, ...args),
  },
};

contextBridge.exposeInMainWorld('electron', electronHandler);

export type ElectronHandler = typeof electronHandler;

const audioHandler = {
  loadAudioBuffer: (filePath: string) =>
    ipcRenderer.invoke(AudioChannels.LOAD_AUDIO_BUFFER, {
      filePath,
    } satisfies LoadAudioBufferArgs),

  getPort: () => ipcRenderer.invoke(AudioChannels.GET_PORT),
  restartService: () => ipcRenderer.invoke(AudioChannels.RESTART_SERVICE),
};

contextBridge.exposeInMainWorld('audio', audioHandler);

export type AudioHandler = typeof audioHandler;
