import { process, file, mods } from './messageTypes';
import { contextBridge, ipcRenderer } from 'electron';

contextBridge.exposeInMainWorld('process', {
  launchMelvor: async (melvorDir, launchMode) => await ipcRenderer.invoke('process', { type: process.launchMelvor, melvorDir, launchMode }),
  openLink: async (url) => await ipcRenderer.invoke('process', { type: process.openLink, url }),
  minimize: () => ipcRenderer.invoke('process', { type: process.minimize }),
  maximize: () => ipcRenderer.invoke('process', { type: process.maximize }),
  exit: () => ipcRenderer.invoke('process', { type: process.exit }),
  getPlatform: () => ipcRenderer.invoke('process', { type: process.getPlatform }),
  getVersion: () => ipcRenderer.invoke('process', { type: process.getVersion })
});

contextBridge.exposeInMainWorld('file', {
  // Returns generated manifest (for validation/renaming) and path
  openScript: async () => await ipcRenderer.invoke('file', { type: file.openScript }),
  // Returns path to opened directory
  openDir: async () => await ipcRenderer.invoke('file', { type: file.openDir }),
  // Returns true/false based on if Melvor is detected at path
  validateMelvorDir: async (dir) => await ipcRenderer.invoke('file', { type: file.validateMelvorDir, dir })
});

contextBridge.exposeInMainWorld('mods', {
  // Returns mod manifest
  parseFile: async (filePath) => await ipcRenderer.invoke('mods', { type: mods.parseFile, filePath }),
  // Returns mod manifest
  parseWeb: async (url) => await ipcRenderer.invoke('mods', { type: mods.parseWeb, origin: url }),
  // Returns mod manifest
  cloneGit: async (url, packageDir) => await ipcRenderer.invoke('mods', { type: mods.cloneGit, origin: url, packageDir }),
  // Returns mod manifest
  browserInstall: async (packageDir, data) => await ipcRenderer.invoke('mods', { type: mods.browserInstall, packageDir, data }),
  // Returns error
  add: async (packageDir, origin, manifest, content) => await ipcRenderer.invoke('mods', { type: mods.add, packageDir, origin, manifest, content }),
  // Returns array of mod manifests
  loadAll: async (packageDir) => await ipcRenderer.invoke('mods', { type: mods.loadAll, packageDir }),
  // Returns mod manifest
  load: async (packageDir, id) => await ipcRenderer.invoke('mods', { type: mods.load, packageDir, id }),
  // Returns latest mod version or null if unable to fetch
  checkForUpdates: async (mod) => await ipcRenderer.invoke('mods', { type: mods.checkForUpdates, mod }),
  // Returns error
  update: async (packageDir, id, browserData) => await ipcRenderer.invoke('mods', { type: mods.update, packageDir, id, browserData }),
  // Returns error
  remove: async (packageDir, id) => await ipcRenderer.invoke('mods', { type: mods.remove, packageDir, id }),
  // Returns error
  inject: async (packageDir, modsToInject) => await ipcRenderer.invoke('mods', { type: mods.inject, packageDir, mods: modsToInject })
});