// Modules to control application life and create native browser window
const {app, BrowserWindow, dialog, ipcMain } = require('electron');
const path = require('path');
const {fs} = require('file-system');

// Open-file dialog
ipcMain.on('file-request', (event) => {
  const options = {
    title: 'Open a file or folder',
  };
  const x = dialog.showOpenDialogSync(options) + '';  // Convert to string
  event.reply("filename", x);
});

function createWindow() {
  // Create the browser window.
  const mainWindow = new BrowserWindow({
    width: 1440,
    height: 900,
    webPreferences: {
      nodeIntegration:
          true,  // For opening file dialog from the renderer process
      contextIsolation: false,
    }
  });

  // and load the index.html of the app.
  mainWindow.loadFile('index.html');

  // Open the DevTools.
  //  mainWindow.webContents.openDevTools()
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(createWindow);

// Quit when all windows are closed.
app.on('window-all-closed', function() {
  // On macOS it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') app.quit();
})

app.on('activate', function() {
  // On macOS it's common to re-create a window in the app when the
  // dock icon is clicked and there are no other windows open.
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.
