import { processHtml } from "./processHtml";
import { Context } from "./context";
import { CompileError } from "./CompileError";
import { processResult } from "./processResult";
import { opts, CommandLineOptions } from "./options";
import { replaceExtension as replaceExt } from "./replace-extension";
import glob = require("glob");
import fs = require("fs");
import path = require('path');
import _ = require("lodash");
import md5 = require("blueimp-md5");
export function entryPoint(options: CommandLineOptions) {
// loop over files and collect results
var results: processResult[] = [];
var allOk = true;
let atLeastOne = false;
_.each(options._, fileName => {
var filesExpanded = glob.sync(fileName);
_.each(filesExpanded, fileName => {
atLeastOne = true;
try
{
results.push(processHtmlFile(fileName, options))
}
catch(ex)
{
allOk = false;
if(ex instanceof CompileError) {
var ce = ex as CompileError;
console.log(`${ce.fileName}: ${ce.message}`);
if(ce.loc) console.log(`in line ${ce.loc.line} column ${ce.loc.col}`);
if(ce.snip) console.log(`${ce.snip}`);
}
else {
console.log(ex);
}
}
});
});
if(!atLeastOne) {
console.log("no input file(s) to process");
}
/*
if(!allOk) {
console.log("compile failed, aborting");
process.exit(-1);
}
outputFile(results, options);
*/
console.log("done");
}
/*
function outputFile(results: processResult[], options)
{
// emit output file
var outputFileName = options.output;
var styles = _.filter(_.map(results, r=> r.styleCommand()), item => item!=="")
var statements = _.map(results, s => s.importCommand(options.trace));
var output = "var Rioct = require('rioct').default;\n\n" + statements.join("\n") + "\n\n" + styles.join("\n") + "\n" + "module.exports = Rioct;\n";
if(path.extname(outputFileName) !== '.js') {
throw `can output only to JavaScript`;
}
fs.writeFileSync(outputFileName, output);
}
*/
function processHtmlFile(fileName: string, options: CommandLineOptions): processResult {
console.log(`processing ${fileName}`)
if(path.extname(fileName) !== '.html') {
throw `only .html files can be processed`;
}
var html = fs.readFileSync(fileName).toString().replace(/^\uFEFF/, '');
var context = new Context();
context.html = html;
context.file = fileName;
context.options = options;
context.hash = md5(fileName,"rioct");
var outName = replaceExt(fileName, options.typescript ? ".tag.ts" : ".tag.js");
context.outName = outName;
var result = processHtml(html, context);
result.fileName = fileName;
result.outName = outName;
// writes to disk .js compiled template
fs.writeFileSync(outName, result.rtTemplateAugumented);
// writes to disk .rt source template
var outRtName = replaceExt(fileName, ".rt");
fs.writeFileSync(outRtName, result.rtSource);
/*
// writes to disk .jsx source template
var outJsxName = replaceExt(fileName, ".tsx");
fs.writeFileSync(outJsxName, result.jsxResult);
*/
return result;
}