const { readdir, stat, copyFile } = require("fs-extra");
const { constants } = require("fs");
const { join, basename } = require("path");

const packagesFolder = "..";

const jsFile = dir => join(dir, "budibase-client.js");
const jsMapFile = dir => join(dir, "budibase-client.js.map");
const sourceJs = jsFile("dist");
const sourceJsMap = jsMapFile("dist");

const appPackages = join(packagesFolder, "server", "appPackages");

const publicMain = appName => join(appPackages, appName, "public", "main");
const publicUnauth = appName => join(appPackages, appName, "public", "unauthenticated");
const nodeModules = appName => join(appPackages, appName, "node_modules", "@budibase", "client", "dist");

(async () => {

    const apps = await readdir(appPackages);

    const copySource = file => async toDir => {
        const dest = join(toDir, basename(file));
        try {
            await copyFile(file, dest, constants.COPYFILE_FICLONE);
            console.log(`COPIED ${file} to ${dest}`);
        } catch(e) {
            console.log(`COPY FAILED ${file} to ${dest}: ${e}`);
        }
    }

    const copySourceJs = copySource(sourceJs);
    const copySourceJsMap = copySource(sourceJsMap);
    

    for(let app of apps) {
        if(!(await stat(join(appPackages, app))).isDirectory()) continue;

        await copySourceJs(nodeModules(app));
        await copySourceJsMap(nodeModules(app));

        await copySourceJs(publicMain(app));
        await copySourceJsMap(publicMain(app));

        await copySourceJs(publicUnauth(app));
        await copySourceJsMap(publicUnauth(app));

        await copySource(
            join("dist", "budibase-client.esm.mjs"))(
            join(packagesFolder, "server", "builder" ));
    }

})();