import { ViteDevServer } from "vite";
import path from "path";



export let devPlugin = () => {
    return {
        name: "dev-plugin",
        configureServer(server: ViteDevServer) {
            require("esbuild").buildSync({
                entryPoints: ["./src/main/mainEntry.ts"],
                bundle: true,
                platform: "node",
                outfile: "./dist/mainEntry.js",
                external: ["electron", "pg", "tedious", "mysql", "mysql2", "oracledb", "pg-query-stream", "sqlite3"],
            });
            // require("esbuild").buildSync({
            //     entryPoints: ["./src/main/preload.ts"],
            //     bundle: true,
            //     platform: "node",
            //     outfile: "./dist/preload.js",
            //     external: ["electron", "pg", "tedious", "mysql", "mysql2", "oracledb", "pg-query-stream", "sqlite3"],
            // });

            if (!server.httpServer) throw new Error("server.httpServer is null check devPlugin.ts  ");

            // 转移logo文件至dist目录
            let targetPath = path.resolve(__dirname, "../dist/logo.ico");
            let logoPath = path.resolve(__dirname, "../static/logo.ico");
            require("fs").copyFileSync(logoPath, targetPath);
            server.httpServer?.once("listening", () => {
                let { spawn } = require("child_process");
                let addressInfo = server.httpServer?.address() as any;
                // console.log(server);
                // console.log(addressInfo);
                if (addressInfo.address == "0.0.0.0"){
                    addressInfo.address = "127.0.0.1"
                }
                let httpAddress = `http://${addressInfo.address}:${addressInfo.port}`;
                let electronProcess = spawn(require("electron").toString(), ["./dist/mainEntry.js", httpAddress], {
                    cwd: process.cwd(),
                    stdio: "inherit",
                });

                electronProcess.on("close", () => {
                    server.close();
                    process.exit();
                });

            });
        },
    };
};

type ResultObject = {
    [key: string]: () => { find: RegExp; code: string };
};
export let getReplacer = () => {
    let externalModels = ["os", "fs", "path", "events", "child_process", "crypto", "http", "buffer", "url", "better-sqlite3", "knex"];
    let result:ResultObject = {};
    for (let item of externalModels) {
        result[item] = () => ({
            find: new RegExp(`^${item}$`),
            code: `const ${item} = require('${item}');export { ${item} as default }`,
        });
    }
    result["electron"] = () => {
        let electronModules = ["clipboard", "ipcRenderer", "nativeImage", "shell", "webFrame"].join(",");
        return {
            find: new RegExp(`^electron$`),
            code: `const {${electronModules}} = require('electron');export {${electronModules}}`,
        };
    };
    return result;
};