const {spawn} = require('child_process');
const webpack = require('webpack');
const WebpackDevServer = require('webpack-dev-server');
const chalk = require('chalk');
const waitOn = require('wait-on');

const rendererConfig = require('../webpack.renderer.js');

const PORT = process.env.PORT || 8601;

const buildRenderer = () => new Promise((resolve, reject) => {
    console.log(chalk.cyan('Building renderer process...'));

    const compiler = webpack(rendererConfig);
    compiler.run((err, stats) => {
        if (err || stats.hasErrors()) {
            console.error(chalk.red('Renderer build failed:', err || stats.toString()));
            reject(err || new Error('Renderer build failed.'));
        } else {
            console.log(chalk.green('Renderer built successfully!'));
            resolve();
        }
    });
});

const startRenderer = async () => {
    console.log(chalk.cyan('Starting Webpack Dev Server...'));

    const compiler = webpack(rendererConfig);
    const server = new WebpackDevServer(
        {
            hot: true,
            compress: true,
            port: PORT,
            headers: {'Access-Control-Allow-Origin': '*'},
            historyApiFallback: true
        },
        compiler
    );

    try {
        await server.start();
        console.log(chalk.green(`Renderer is running at http://localhost:${PORT}`));
    } catch (err) {
        console.error(chalk.red('Failed to start Webpack Dev Server:', err));
        throw err;
    }
};

const startElectron = async () => {
    console.log(chalk.cyan('Starting Electron...'));

    await waitOn({resources: [`http://localhost:${PORT}`]});

    spawn('electron', ['.'], {
        stdio: 'inherit',
        shell: true
    });
};

const start = () => {
    console.log(chalk.green('Building main process...'));

    const mainProcess = spawn('npm', ['run', 'compile:main'], {
        stdio: 'inherit',
        shell: true
    });

    mainProcess.on('exit', async code => {
        if (code === 0) {
            console.log(chalk.green('Main process built successfully!'));

            await buildRenderer();
            await startRenderer();
            await startElectron();
        } else {
            console.log(chalk.red('Main process build failed!'));
            process.exit(1);
        }
    });
};

start();