var system = require('system'),

fs = require('fs'),
webpage = require('webpage');

// streams var stdout = system.stdout;

// global opts var options = JSON.parse(fs.read(“/dev/stdin”)),

globals = {
    "page": null,
    "timer": null,
    "expired": false,
    "rendered": false,
    "html": fs.read(options.html)
};

// functions var printJson,

logMessage,
logTrace,
logError,
printPage,
waitForRender,
writeHtml,
run;

printJson = function(messageType, message) {

var payload = {};
payload[messageType] = message;
stdout.writeLine(JSON.stringify(payload));
stdout.flush();

};

logMessage = function(message) {

printJson('console', message);

};

logTrace = function(trace) {

if (trace && trace.length) {
    var traceStack = [];
    trace.forEach(function(t) {
        traceStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : ''));
    });

    printJson('trace', traceStack.join('\n'));
}

};

logError = function(message, trace) {

printJson('error', message);

logTrace(trace);

};

printPage = function(url) {

globals.page = webpage.create();

globals.page.setContent(globals.html, url);

// Log javascript console messages
globals.page.onConsoleMessage = function(msg) {
    if (msg.trim() === "-- PHRENDER COMPLETE --"){
        logMessage('phrender complete');
        globals.rendered = true;
    } else if (!msg.match(/^\[✓\].+/)) {
        logMessage(msg);
    }
};

// capture errors
globals.page.onError = logError;

globals.page.injectJs(options.javascript);

// Catch something
globals.timer = setTimeout(writeHtml, options.timeout);

// Wait for the flag to switch
waitForRender();

};

waitForRender = function() {

if (!globals.expired) {
    if (!globals.rendered) {
        setTimeout(waitForRender, 100);
    } else {
        clearTimeout(globals.timer);
        writeHtml();
    }
}

};

writeHtml = function() {

globals.expired = true;
var html = globals.page.evaluate(function() {
    return document.documentElement.outerHTML;
});
printJson("page", html);
phantom.exit();

};

run = function() {

printPage(options.url);

};

run();