const { app, BrowserWindow, ipcMain } = require('electron');

const net = require('node:net');
const path = require('node:path');

process.on('uncaughtException', () => {
  app.exit(1);
});

if (process.argv.includes('--app-enable-sandbox')) {
  app.enableSandbox();
}

let currentWindowSandboxed = false;

app.whenReady().then(() => {
  function testWindow(isSandboxed, callback) {
    currentWindowSandboxed = isSandboxed;
    const currentWindow = new BrowserWindow({
      show: false,
      webPreferences: {
        preload: path.join(__dirname, 'electron-app-mixed-sandbox-preload.js'),
        sandbox: isSandboxed
      }
    });
    currentWindow.loadURL('about:blank');
    currentWindow.webContents.once('devtools-opened', () => {
      if (isSandboxed) {
        argv.sandboxDevtools = true;
      } else {
        argv.noSandboxDevtools = true;
      }
      if (callback) {
        callback();
      }
      finish();
    });
    currentWindow.webContents.openDevTools();
  }

  const argv = {
    sandbox: null,
    noSandbox: null,
    sandboxDevtools: null,
    noSandboxDevtools: null
  };

  let connected = false;

  testWindow(true, () => {
    testWindow();
  });

  function finish() {
    if (
      connected &&
      argv.sandbox != null &&
      argv.noSandbox != null &&
      argv.noSandboxDevtools != null &&
      argv.sandboxDevtools != null
    ) {
      client.once('end', () => {
        app.exit(0);
      });
      client.end(JSON.stringify(argv));
    }
  }

  const socketPath =
    process.platform === 'win32' ? '\\\\.\\pipe\\electron-mixed-sandbox' : '/tmp/electron-mixed-sandbox';
  const client = net.connect(socketPath, () => {
    connected = true;
    finish();
  });

  ipcMain.on('argv', (event, value) => {
    if (currentWindowSandboxed) {
      argv.sandbox = value;
    } else {
      argv.noSandbox = value;
    }
    finish();
  });
});
