#!/usr/bin/env node

"use strict";

const build_conf = {
    protected_dirs: ["assets", "style", "news-articles", "game-articles", "software-articles"],
};

const fs = require("fs");
const browserify = require("browserify");
const curDir = process.cwd();

// Handle home page
const b = browserify();
b.add(`${curDir}/src/main.js`)
    .bundle()
    .pipe(fs.createWriteStream(`${curDir}/public/main.js`));

// Handle subpages
function getPageHtml(pagename) {
    return `
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
        <title>Kuadrado Software - ${pagename}</title>
        <link rel="icon" type="image/svg+xml" href="/favicon.svg">
        <link href="/style/style.css" rel="stylesheet" />
    </head>
    <body>
        <main></main>
    </body>
    <script type="text/javascript" src="./${pagename}.js"></script>
</html>
    `;
}

const pages = fs.readdirSync(`${curDir}/src/pages`);

for (const p of pages) {
    const fPath = `${curDir}/src/pages/${p}`;
    const targetDirPath = `${curDir}/public/${p}`;

    if (!fs.existsSync(targetDirPath)) {
        fs.mkdirSync(targetDirPath);
    }

    const b = browserify();

    b.add(fPath)
        .bundle()
        .pipe(fs.createWriteStream(`${targetDirPath}/${p}.js`));

    const page = fs.createWriteStream(`${targetDirPath}/index.html`);
    page.write(getPageHtml(p));
}

// If pages have been deleted in source, remove them in output directory too.
for (const dir of fs.readdirSync(`${curDir}/public`).filter(f => {
    if (build_conf.protected_dirs.includes(f)) return false;
    const stats = fs.statSync(`${curDir}/public/${f}`);
    return stats.isDirectory();
})) {
    if (!pages.includes(dir)) {
        const dPath = `${curDir}/public/${dir}`;
        try {
            const nestedFiles = fs.readdirSync(dPath);
            for (const nf of nestedFiles) {
                fs.unlinkSync(`${dPath}/${nf}`);
            }
            fs.rmdirSync(dPath);
        } catch (error) {
            console.error(error);
        }
    }
}