/* eslint-disable @typescript-eslint/no-var-requires -- electron-builder loads this hook as a CommonJS module; require is required. */
// electron-builder afterPack hook: harden Electron fuses on the packaged binary.
//
// By default Electron ships with several fuses ON that let a local process turn
// the signed app into a generic Node interpreter or attach a debugger:
//   - RunAsNode (ELECTRON_RUN_AS_NODE)
//   - EnableNodeCliInspectArguments (--inspect)
//   - EnableNodeOptionsEnvironmentVariable (NODE_OPTIONS injection)
// We flip them OFF. OnlyLoadAppFromAsar + EnableEmbeddedAsarIntegrityValidation
// are intentionally left for later: integrity validation is only meaningful once
// the binary is code-signed (no signing in the current build chain).
const path = require('node:path');
const { existsSync } = require('node:fs');
const { flipFuses, FuseVersion, FuseV1Options } = require('@electron/fuses');

exports.default = async function afterPack(context) {
  const { appOutDir, packager, electronPlatformName } = context;
  const productName = packager.appInfo.productFilename;
  const isMac = electronPlatformName === 'darwin' || electronPlatformName === 'mas';

  let electronBinary;
  if (isMac) {
    electronBinary = path.join(appOutDir, `${productName}.app`, 'Contents', 'MacOS', productName);
  } else if (electronPlatformName === 'win32') {
    electronBinary = path.join(appOutDir, `${productName}.exe`);
  } else {
    electronBinary = path.join(appOutDir, packager.executableName || productName);
  }

  if (!existsSync(electronBinary)) {
    throw new Error(`afterPack: could not find Electron binary to harden at ${electronBinary}`);
  }

  await flipFuses(electronBinary, {
    version: FuseVersion.V1,
    // Re-applies the ad-hoc signature macOS needs after the binary is mutated.
    resetAdHocDarwinSignature: isMac,
    [FuseV1Options.RunAsNode]: false,
    [FuseV1Options.EnableNodeCliInspectArguments]: false,
    [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false,
  });
};
