const fs = require('fs');
const path = require('path');
const consoleCmd = require('./console');

function readJSFiles(dir) {
    return fs.readdirSync(dir).filter(file => file.endsWith('.js'));
}

function parsePluginConfig(filePath) {
    const pluginConfig = {};

    // Assuming pluginConfig is a JavaScript object defined in each .js file
    try {
        const pluginExports = require(filePath);
        Object.assign(pluginConfig, pluginExports.pluginConfig);

        if(pluginConfig.server_embedded) {
            setTimeout(function() {
                consoleCmd.logInfo(`Server plugin ${pluginConfig.name} ${pluginConfig.version} initialized successfully.`);
            }, 500)
            return pluginConfig;
        }

        if (pluginConfig.frontEndPath) {
            const sourcePath = path.join(path.dirname(filePath), pluginConfig.frontEndPath);
            const destinationDir = path.join(__dirname, '../web/js/plugins', path.dirname(pluginConfig.frontEndPath));

            // Check if the source path exists
            if (!fs.existsSync(sourcePath)) {
                console.error(`Error: source path ${sourcePath} does not exist.`);
                return pluginConfig;
            }

            // Check if the destination directory exists, if not, create it
            if (!fs.existsSync(destinationDir)) fs.mkdirSync(destinationDir, { recursive: true }); // Create directory recursively

            const destinationFile = path.join(destinationDir, path.basename(sourcePath));

            // Platform-specific handling for symlinks/junctions
            if (process.platform !== 'win32') {
                // On Linux, create a symlink
                try {
                    if (fs.existsSync(destinationFile)) fs.unlinkSync(destinationFile); // Remove existing file/symlink
                    fs.symlinkSync(sourcePath, destinationFile);
                    setTimeout(function() {
                        consoleCmd.logInfo(`Plugin ${pluginConfig.name} ${pluginConfig.version} initialized successfully.`);
                    }, 500)
                } catch (err) {
                    console.error(`Error creating symlink at ${destinationFile}: ${err.message}`);
                }
            }
        }
    } catch (err) {
        console.error(`Error parsing plugin config from ${filePath}: ${err.message}`);
    }

    return pluginConfig;
}

// Ensure the web/js/plugins directory exists
const webJsPluginsDir = path.join(__dirname, '../web/js/plugins');
if (!fs.existsSync(webJsPluginsDir)) fs.mkdirSync(webJsPluginsDir, { recursive: true });

const pluginsDir = path.join(__dirname, '../plugins');

if (process.platform === 'win32') {
    const destinationPluginsDir = path.join(__dirname, '../web/js/plugins');

    // On Windows, create a junction
    try {
        if (fs.existsSync(destinationPluginsDir)) fs.rmSync(destinationPluginsDir, { recursive: true });
        fs.symlinkSync(pluginsDir, destinationPluginsDir, 'junction');
    } catch (err) {
        console.error(`Error creating junction at ${destinationPluginsDir}: ${err.message}`);
    }
}

const pluginConfigs = [];
readJSFiles(pluginsDir).forEach(file => {
    const filePath = path.join(pluginsDir, file);
    const config = parsePluginConfig(filePath);
    if (Object.keys(config).length > 0) pluginConfigs.push(config);
});

module.exports = pluginConfigs;
