const { contextBridge, ipcRenderer } = require('electron')

// New window / Modal / window control wrappers
const windowApi = {
  /**
   * Open a new window and load the specified page
   * @param {{url: string, width?: number, height?: number, title?: string}} payload
   */
  open: (payload) => ipcRenderer.invoke('window:open', payload),
  /**
   * Open a Modal window and load the specified page
   * @param {{url: string, width?: number, height?: number, title?: string}} payload
   */
  openModal: (payload) => ipcRenderer.invoke('window:open-modal', payload),
  close: () => ipcRenderer.invoke('window:close-current'),
  minimize: () => ipcRenderer.invoke('window:minimize-current'),
  maximize: () => ipcRenderer.invoke('window:maximize-current'),
  isMaximized: () => ipcRenderer.invoke('window:is-maximized')
}

// mixone IPC: dialog / fs / clipboard / shell / app
// Channel prefix `mixone:`, strictly one-to-one with main process ipcMain.handle
const dialogApi = {
  openFile: (options) => ipcRenderer.invoke('mixone:dialog:open-file', options),
  saveFile: (options) => ipcRenderer.invoke('mixone:dialog:save-file', options),
  messageBox: (options) => ipcRenderer.invoke('mixone:dialog:message-box', options)
}

const fsApi = {
  readText: (filePath, options) => ipcRenderer.invoke('mixone:fs:read-text', filePath, options),
  writeText: (filePath, content, options) => ipcRenderer.invoke('mixone:fs:write-text', filePath, content, options),
  exists: (filePath) => ipcRenderer.invoke('mixone:fs:exists', filePath),
  stat: (filePath) => ipcRenderer.invoke('mixone:fs:stat', filePath),
  unlinkSafe: (filePath) => ipcRenderer.invoke('mixone:fs:unlink-safe', filePath),
  readDir: (dirPath) => ipcRenderer.invoke('mixone:fs:read-dir', dirPath),
  mkdir: (dirPath, options) => ipcRenderer.invoke('mixone:fs:mkdir', dirPath, options),
  rename: (oldPath, newPath) => ipcRenderer.invoke('mixone:fs:rename', oldPath, newPath),
  copyFile: (src, dest) => ipcRenderer.invoke('mixone:fs:copy-file', src, dest),
  appendText: (filePath, content, options) => ipcRenderer.invoke('mixone:fs:append-text', filePath, content, options),
  readJson: (filePath) => ipcRenderer.invoke('mixone:fs:read-json', filePath),
  writeJson: (filePath, data, options) => ipcRenderer.invoke('mixone:fs:write-json', filePath, data, options)
}

const clipboardApi = {
  readText: () => ipcRenderer.invoke('mixone:clipboard:read-text'),
  writeText: (text) => ipcRenderer.invoke('mixone:clipboard:write-text', text),
  readHtml: () => ipcRenderer.invoke('mixone:clipboard:read-html'),
  writeHtml: (html) => ipcRenderer.invoke('mixone:clipboard:write-html', html),
  readImage: () => ipcRenderer.invoke('mixone:clipboard:read-image'),
  clear: () => ipcRenderer.invoke('mixone:clipboard:clear')
}

const shellApi = {
  openExternal: (url, options) => ipcRenderer.invoke('mixone:shell:open-external', url, options),
  showItemInFolder: (fullPath) => ipcRenderer.invoke('mixone:shell:show-item-in-folder', fullPath),
  openPath: (fullPath) => ipcRenderer.invoke('mixone:shell:open-path', fullPath),
  beep: () => ipcRenderer.invoke('mixone:shell:beep')
}

const appApi = {
  info: () => ipcRenderer.invoke('mixone:app:info'),
  relaunch: () => ipcRenderer.invoke('mixone:app:relaunch'),
  quit: () => ipcRenderer.invoke('mixone:app:quit')
}

contextBridge.exposeInMainWorld('{{bridgeGlobal}}', {
  platform: process.platform,
  version: process.versions.electron,
  node: process.versions.node,
  chrome: process.versions.chrome,
  isDesktop: true,
  window: windowApi,
  dialog: dialogApi,
  fs: fsApi,
  clipboard: clipboardApi,
  shell: shellApi,
  app: appApi
})