"use strict";

const {contextBridge, ipcRenderer, webFrame} = require("electron");

let fileOpenListener       = null;
let closeFileListener      = null;
let settingsChangeListener = null;

contextBridge.exposeInMainWorld("api", {
	openFileDialog : ()       => ipcRenderer.send("WindowManager::openFileDialog"),
	onFileOpen     : callback => {
		if (fileOpenListener)
			ipcRenderer.off("Ation::openFile", fileOpenListener);
		fileOpenListener = (_, presentation) => callback(presentation);
		ipcRenderer.on("Ation::openFile", fileOpenListener);
	},
	onFileClose    : callback => {
		if (closeFileListener)
			ipcRenderer.off("Ation::closeFile", closeFileListener);
		closeFileListener = () => callback();
		ipcRenderer.on("Ation::closeFile", closeFileListener);
	},
	openFile       : filePath => ipcRenderer.send("WindowManager::openFile", filePath),
	closeFile      : () => ipcRenderer.send("Ation::closeFile"),

	clearCache : () => webFrame.clearCache(),
	appVersion : async () => await ipcRenderer.invoke("Ation::appVersion"),
	fonts      : async () => await ipcRenderer.invoke("FontManager::fonts"),
	resize     : size => ipcRenderer.invoke("SettingsManager::resize", size)
});

contextBridge.exposeInMainWorld("appSettings", {
	get      : async (key, defaultValue = null) => await ipcRenderer.invoke("SettingsManager::get", key, defaultValue),
	set      : async (key, value) => await ipcRenderer.invoke("SettingsManager::set", key, value),
	all      : async () => await ipcRenderer.invoke("SettingsManager::all"),
	onChange : callback => {
		if (settingsChangeListener)
			ipcRenderer.off("SettingsManager::change", settingsChangeListener);
		settingsChangeListener = (_, settings) => callback(settings);
		ipcRenderer.on("SettingsManager::change", settingsChangeListener);
	}
});