#!/usr/bin/env phantomjs

var fs = require('fs');
var sys = require('system');
var server = require('webserver').create();
var parser = require('./parser');
var client = require('./client');
var utils = require('./utils');


var port;
if(sys.args.length > 1) {
    port = parseInt(sys.args[1]);
} else {
    port = 1024;
}


var ok = server.listen(port, function(request, response) {
    if(request.method === 'POST') {
        try {
            var raw = request.postRaw || request.post || '{}',
                req = parser.setDefaults(JSON.parse(raw));
            utils.info('recv: %s', req.targetUrl);
            var reqId = client.urlopen(req, function(err, res) {
                if(err) {
                    send(response, 500, res);
                } else {
                    send(response, 200, res);
                }
            });
            utils.info('proc: %s (%s)', reqId, req.targetUrl);
        } catch(ex) {
            send(response, 400, ex);
        }
    } else if (request.method === 'GET') {
        response.statusCode = 200;
        response.setHeader('X-Powered-By', 'PhantomJS')
        response.setHeader('Content-Type', 'text/plain')
        response.write('Powered by PhantomJS 2.0.0');
        response.close();
    } else{
        send(response, 405);
    }
});


if(ok) {
    var pidfile = '/var/run/webkit-' + port.toString() + '.pid';
    utils.info('service started (listen %d)', port);
    utils.info('write pidfile: %s (pid %d)', pidfile, sys.pid);
    fs.write(pidfile, sys.pid.toString(), 'w');
} else {
    utils.error('service failed to start');
    phantom.exit(1);
}


function send(response, code, data){
    if(code === 200) {
        utils.info('send: %s (%d)', data.request.requestId, code);
    } else {
        utils.warn('send: %s (%d)', data, code);
    }
    response.statusCode = code;
    response.setHeader('X-Powered-By', 'PhantomJS')
    response.setHeader('Content-Type', 'application/json')
    response.write(JSON.stringify(data || '{}'));
    response.close();
}