import { app, shell, BrowserWindow, ipcMain, globalShortcut, dialog } from 'electron';
import { join } from 'path';
import { electronApp, optimizer, is } from '@electron-toolkit/utils';
import icon from '../../resources/icon.png?asset';

//关闭exe命令
function killProcessByName(processName) {
	const command = `taskkill /IM ${processName} /F`;
	const { exec } = require('child_process');

	exec(command, (error, stdout, stderr) => {
		if (error) {
			console.error(`执行的错误: ${error}`);
			return;
		}
		console.log(`stdout: ${stdout}`);
		console.error(`stderr: ${stderr}`);
	});
}

app.commandLine.appendSwitch('disable-web-security');
function createWindow() {
	// Create the browser window.
	const mainWindow = new BrowserWindow({
		width: 1280,
		height: 1024,
		show: false,
		autoHideMenuBar: true,
		icon,
		webPreferences: {
			preload: join(__dirname, '../preload/index.js'),
			sandbox: false,
			nodeIntegration: true,
			// 禁用同源策略，允许跨域请求
			webSecurity: false,
			contextIsolation: false,
			// csp: "default-src 'self'; connect-src 'self' *",
			// 禁止build环境使用DevTool
			// devTools: is.dev ? true : false
			devTools: true
		}
	});
	//开发模式 开启调试
	if (is.dev) {
		mainWindow.webContents.openDevTools();
	}

	mainWindow.on('ready-to-show', () => {
		mainWindow.show();
	});

	mainWindow.webContents.setWindowOpenHandler(details => {
		shell.openExternal(details.url);
		return { action: 'deny' };
	});
  //基于electronic-vite-cli的渲染器HMR。
  //加载用于开发的远程URL或用于生产的本地html文件。
	if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
		mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']);
	} else {
		mainWindow.loadFile(join(__dirname, '../renderer/index.html'));
	}

	// 设置DevTools快捷键
	// 设置DevTools快捷键
	globalShortcut.register('CommandOrControl+Shift+i', function () {
		mainWindow.webContents.openDevTools();
	});
	return mainWindow;
}

// 程序单例模式
let myWindow = null;
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
	// 如果已经有同样的该程序正在运行，则不启动
	app.quit();
} else {
	// 如果检测到有同样的该程序正在试图启动...
	app.on('second-instance', () => {
		if (myWindow) {
			// 弹出系统提示对话框
			dialog.showMessageBox({
				message: '此程序已经正在运行'
			});
			// 如果该程序窗口处于最小化状态，则恢复窗口
			if (myWindow.isMinimized()) myWindow.restore();
			// 将该程序窗口置为当前聚焦态
			myWindow.focus();
		}
	});

	//当Electron完成时，将调用此方法
  //初始化并准备创建浏览器窗口。
  //某些API只能在此事件发生后使用。
	const { spawn } = require('child_process');
	let child = null;
	let exePluginsExeList = [];
	app.whenReady().then(() => {
		const fs = require('fs');
		const path = require('path');

		const logStream = fs.createWriteStream('app.log', { flags: 'a' }); // 日志文件
		let exePath = path.resolve('./resources/app.asar.unpacked/resources/service');
		let exePluginsPath = path.resolve('./resources/app.asar.unpacked/resources/service/plugins');
		//单独配置测试环境
		if (process.env.NODE_ENV === 'development') {
			exePath = path.resolve('./resources/service');
			exePluginsPath = path.resolve('./resources/service/plugins');
		}

		//查询所有插件目录下的exe文件
		fs.readdir(exePluginsPath, (err, files) => {
			if (err) {
				return console.log('Unable to scan directory: ' + err);
			}
			// 筛选出以.exe结尾的文件
			exePluginsExeList = files.filter(file => path.extname(file).toLowerCase() === '.exe');
		});
    const userDataPath = app.getPath('userData');
		child = spawn('./main.exe', ['--args', userDataPath], { cwd: exePath, stdio: ['ignore', 'pipe', 'pipe'] });

		//监听进程的输出
		child.stdout.on('data', data => {
			console.log('stdout:', data.toString());
			logStream.write(data);
		});

		child.stderr.on('data', data => {
			console.error('stderr:', data.toString());
			logStream.write(data);
		});

		child.on('close', code => {
			console.log(`子进程已退出，退出码 ${code}`);
			logStream.end();
		});

		child.on('exit', (code, signal) => {
			console.log(`子进程已退出，退出码 ${code}，信号： ${signal}`);
			logStream.write(`子进程已退出，退出码 ${code}，信号： ${signal}`);
			logStream.end();
		});

		// Set app user model id for windows
		electronApp.setAppUserModelId('com.electron');

    //开发中默认按F12打开或关闭DevTools
    //在生产中忽略CommandOrControl+R。
    //看https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
		app.on('browser-window-created', (_, window) => {
			optimizer.watchWindowShortcuts(window);
		});

		// IPC test
		ipcMain.on('ping', () => console.log('pong'));

		myWindow = createWindow();

		app.on('activate', function () {
      //在macOS上，当出现以下情况时，通常会在应用程序中重新创建窗口
      //单击dock图标后，没有其他打开的窗口。
			if (BrowserWindow.getAllWindows().length === 0) createWindow();
		});
	});

  // 处理来自渲染进程的请求
  // ipcMain.handle('readFile', async (event, path) => {
  //   return new Promise((resolve, reject) => {
  //     fs.readFile(join(__dirname, path), 'utf8', (err, data) => {
  //       if (err) {
  //         reject(err);
  //       } else {
  //         resolve(data);
  //       }
  //     });
  //   });
  // });
  //
  // ipcMain.handle('writeFile', async (event, path, content) => {
  //   return new Promise((resolve, reject) => {
  //     fs.writeFile(join(__dirname, path), content, 'utf8', (err) => {
  //       if (err) {
  //         reject(err);
  //       } else {
  //         resolve();
  //       }
  //     });
  //   });
  // });
  //
  // // 处理来自渲染进程的请求
  // ipcMain.handle('readDirectory', async (event, directoryPath) => {
  //   return new Promise((resolve, reject) => {
  //     fs.readdir(join(__dirname, directoryPath), (err, files) => {
  //       if (err) {
  //         reject(err);
  //       } else {
  //         resolve(files);
  //       }
  //     });
  //   });
  // });

	//关闭所有窗口后退出，macOS除外。在那里，这很常见
  //让应用程序及其菜单栏保持活动状态，直到用户退出
  //显式使用Cmd+Q。
	app.on('window-all-closed', () => {
		if (process.platform !== 'darwin') {
			// 循环关闭插件 EXE 列表
			exePluginsExeList.forEach(exe => {
				killProcessByName(exe);
			});
			// child.kill('SIGTERM'); // 或者使用 'SIGKILL' 来强制关闭
			// killProcessByName('gateway.exe');
			// 循环关闭后端服务
			killProcessByName('main.exe');
			app.quit();
		}
	});
}

//在此文件中，您可以包含应用程序的其他特定主进程
//代码。您也可以将它们放在单独的文件中，并在此处要求它们。

//获取应用程序版本
ipcMain.handle('get-app-version', () => {
	return app.getVersion();
});
