import { ipcRenderer } from 'electron';

import type { IpcEventMap, IpcInvokeMap } from '../shared/ipc/contracts';

export async function invoke<K extends keyof IpcInvokeMap>(
  channel: K,
  payload: IpcInvokeMap[K]['req'],
): Promise<IpcInvokeMap[K]['res']> {
  return (await ipcRenderer.invoke(channel as string, payload)) as IpcInvokeMap[K]['res'];
}

export function on<K extends keyof IpcEventMap>(
  channel: K,
  listener: (payload: IpcEventMap[K]) => void,
): () => void {
  const wrapped = (_: Electron.IpcRendererEvent, payload: unknown) => {
    listener(payload as IpcEventMap[K]);
  };
  ipcRenderer.on(channel as string, wrapped);
  return () => {
    ipcRenderer.off(channel as string, wrapped);
  };
}
