#!/usr/bin/env node
const Lib = {
	fs: require('fs'),
	mime: require('mime-types'),
	crypto: require('crypto'),
	babel: require('@babel/core'),
	uglify: require('uglify-js'),
};

const BuildScriptFile = (scriptFile, options) => {
	options = {
		forceResult: false,
		checkHash: true,
	...options };
	Lib.fs.mkdirSync(`${__dirname}/Build`, { recursive: true });
	const __scriptname = scriptFile.split('/').slice(-1)[0].split('.').slice(0, -1).join('.');
	const scriptScript = Lib.fs.readFileSync(scriptFile, 'utf8');
	const compiledPath = `${__dirname}/Build/${__scriptname}.js`;
	const minifiedPath = `${__dirname}/Build/${__scriptname}.min.js`;
	const hashPath = `${__dirname}/Build/${__scriptname}.js.hash`;
	const hashOld = (Lib.fs.existsSync(hashPath) && Lib.fs.readFileSync(hashPath, 'utf8'));
	const hashNew = Lib.crypto.createHash('sha256').update(scriptScript).digest('hex');
	if (!options.checkHash || !Lib.fs.existsSync(compiledPath) || !Lib.fs.existsSync(minifiedPath) || !(hashOld === hashNew)) {
		const compiledScript = Lib.babel.transformSync(scriptScript,
			JSON.parse(Lib.fs.readFileSync(`${__dirname}/babel.config.json`, 'utf8'))).code;
		const minifiedScript = Lib.uglify.minify(compiledScript).code;
		Lib.fs.writeFileSync(compiledPath, compiledScript);
		Lib.fs.writeFileSync(minifiedPath, minifiedScript);
		Lib.fs.writeFileSync(hashPath, hashNew);
		return { compiled: compiledScript, minified: minifiedScript };
	}
	return { notice: `Target "${scriptFile}" is up-to-date.`, ...(options.forceResult && {
		compiled: Lib.fs.readFileSync(compiledPath, 'utf8'),
		minified: Lib.fs.readFileSync(minifiedPath, 'utf8'),
	}) };
};

//const BuildHtmlFile = (htmlFile) => {
//
//}

const EncodeStaticFiles = (files, /* encoding='base64' */) => {
	const data = {};
	files.forEach(file => (data[file] = `data:${Lib.mime.lookup(file)};base64,${Lib.fs.readFileSync(file).toString('base64')}`));
	return data;
};

module.exports = { BuildScriptFile, EncodeStaticFiles };

if (require.main === module) {
	console.log(eval(process.argv.slice(-1)[0]));
}