/**
 * Generate html files, target-dependent
 * Context for embedding page is loaded from markdown file
 */
const process = require('process');
const path = require('path');
const fs = require('fs');
const posthtml = require('posthtml');
const expressions = require('posthtml-expressions');
const marked = require('marked');
const config = require('../build.json');
// const config = require('../src/config.json');

const target = process.env.NODE_ENV || 'development';

// Change current directory to script location so that
// the relative paths of the resources can be resolved
process.chdir(path.dirname(process.argv[1]));

function createDirectory(dir) {
    fs.mkdirSync(
        dir,
        { recursive: true },
        (error) => {
            if (error !== null) {
                console.error('Error while creating directory', error);
            }
        }
    );
}

function createVisualisationHtml() {
    const visualisation = fs.readFileSync(
        path.join(
            '../',
            config.path.input,
            config.path.html,
            config.path.skeletons,
            config.html.visualisation.skeleton
        ), 'utf8'
    );

    // Generate html file for the visualisation
    posthtml(
        expressions({
            locals: {
                javascript: path.join(config.path.js, `${config.main}${config[target].infix}.js`),
                stylesheet: path.join(config.path.css, `${config.main}${config[target].infix}.css`)
            }
        })
    ).process(visualisation)
        .then((result) => {
            fs.writeFileSync(
                path.join(
                    '../',
                    config.path.output,
                    config.html.visualisation.name
                ), result.html
            );
        });
}

function createContextHtml() {
    // Load context from markdown file
    const md = fs.readFileSync(
        path.join(
            '../',
            config.path.input,
            config.path.html,
            config.path.markdown,
            config.context
        ), 'utf8');

    // Convert markdown to html
    var converted = marked(md);

    // Load html skeleton
    const skeleton = fs.readFileSync(
        path.join(
            '../',
            config.path.input,
            config.path.html,
            config.path.skeletons,
            config.html.index.skeleton
        ), 'utf8');

    // Compile html
    // 1: Assign variables to iframe in context
    // 2: Place generated html from (1) into skeleton
    // write file
    posthtml(
        expressions({
            locals: {
                d3: config.html.visualisation.name,
                width: `${config.width}px`,
                height: `${config.height}px`
            }
        })
    ).process(converted)
        .then((result) => posthtml(expressions({locals: { content: result.html }}))
            .process(skeleton)
            .then((result) => {
                fs.writeFileSync(
                    path.join(
                        '../',
                        config.path.output,
                        config.html.index.name
                    ), result.html
                );
            }));
}

function createHtml() {
    createVisualisationHtml();
    createContextHtml();
}

createDirectory(path.join('../', config.path.output));
createHtml();
