const { app, BrowserWindow, ipcMain, Menu, Notification, Tray, nativeImage, dialog } = require('electron');
const { autoUpdater } = require('electron-updater');
const server = require('./server.js');
const log = require('electron-log');
const path = require('path');

// THOUGHTS: Make this APP more modularize and platform agnostic...

process.env['APP_PATH'] = app.getAppPath();

autoUpdater.logger = log;
log.info('App starting...');

const editMenu = Menu.buildFromTemplate([
	{
		label: "Qortal", 
		submenu: [{
			label: "Quit", 
			click() {
				app.quit();
			}
		}]
	},
	{
		label: "Edit",
		submenu: [
			{label: "Undo", accelerator: "CommandOrControl+Z", selector: "undo:"},
			{label: "Redo", accelerator: "CommandOrControl+Shift+Z", selector: "redo:"},
			{type: "separator"},
			{label: "Cut", accelerator: "CommandOrControl+X", selector: "cut:"},
			{label: "Copy", accelerator: "CommandOrControl+C", selector: "copy:"},
			{label: "Paste", accelerator: "CommandOrControl+V", selector: "paste:"},
			{label: "Select All", accelerator: "CommandOrControl+A", selector: "selectAll:"}
		]
	}
]);

Menu.setApplicationMenu(editMenu);

let myWindow = null;

// TODO: Move the Tray function into another file (maybe Tray.js) -_-
// const tray = new Tray(nativeImage.createEmpty());

const APP_ICON = path.join(__dirname, 'img', 'icons');

const iconPath = () => {
	return APP_ICON + (process.platform === 'win32' ? '/ico/256x256.ico' : '/png/256x256.png');
};

function createWindow() {
	myWindow = new BrowserWindow({
		backgroundColor: '#eee',
		width: 1280,
		height: 720,
		minWidth: 700,
		minHeight: 640,
		icon: iconPath(),
		title: "Qortal",
		autoHideMenuBar: true,
		webPreferences: {
			nodeIntegration: false,
			partition: 'persist:webviewsession',
			enableRemoteModule: false,
                        nativeWindowOpen: false,
			sandbox: true
		},
		show: false
	})
	myWindow.maximize();
	myWindow.show();
	myWindow.loadURL('http://localhost:12388/app/wallet')
	myWindow.on('closed', function () {
		myWindow = null
	})
}

const createTray = () => {
	let myTray = new Tray(path.join(__dirname, 'img', 'icons', 'png', '32x32.png'))
	const contextMenu = Menu.buildFromTemplate([{
		label: "Quit", click() {
			myTray.destroy();
			app.quit();
		},
	}])
	myTray.setTitle("QORTAL UI")
	myTray.setToolTip("QORTAL UI")
	myTray.setContextMenu(contextMenu)
}

const isLock = app.requestSingleInstanceLock();

if (!isLock) {
	app.quit()
} else {
	app.on('second-instance', (event, cmd, dir) => {
		if (myWindow) {
			if (myWindow.isMinimized()) myWindow.restore()
			myWindow.focus()
		}
	})
	app.allowRendererProcessReuse = true
	app.on('ready', () => {
		createWindow();
		createTray();
		if (process.platform === 'win32') {
			app.setAppUserModelId("org.qortal.QortalUI");
		}
		autoUpdater.checkForUpdatesAndNotify();
		setInterval(() => {
			autoUpdater.checkForUpdatesAndNotify();
		}, 1000 * 60 * 15)
	})
	app.on('window-all-closed', function () {
		if (process.platform !== 'darwin') {
			app.quit();
		}
	})
	app.on('activate', function () {
		if (myWindow === null) {
			createWindow();
			createTray();
		}
	})
	ipcMain.on('app_version', (event) => {
		log.info(app.getVersion());
		mainWindow.webContents.send('app_version', { version: app.getVersion() });
	});
	autoUpdater.on('update-available', () => {
		const n = new Notification({
			title: 'Update Available!',
			body: 'It will be downloaded ⌛️ in the background!'
		})
        	n.show();
	})
	autoUpdater.on('update-downloaded', (event) => {
		const dialogOpts = {
			type: 'info',
			buttons: ['Restart now', 'Install after close Qortal UI'],
			title: 'Update available',
			detail: 'A new Qortal UI version has been downloaded. Click RESTART NOW to apply update, or INSTALL AFTER CLOSE QORTAL UI to install after you quit the UI.'
		}
		dialog.showMessageBox(dialogOpts).then((returnValue) => {
			if (returnValue.response === 0) {
				autoUpdater.quitAndInstall()
			} else {
				return
			}
		})
	})
	autoUpdater.on('error', (err) => {
		const n = new Notification({
			title: 'Error while Updating...',
			body: err
		})
		n.show();
	})
}
