#! /usr/bin/env node

var host = process.env.host || '127.0.0.1';
var port = Number(process.env.port) || 42101;

var pipe = '/tmp/krebscode.painload.cholerab.ttycnser.' + process.env.LOGNAME;

var fs = require('fs');
var http = require('http');
var slurp = require('./src/io/slurp');
var spawn = require('child_process').spawn;

var plugs = process.argv.slice(2);

if (plugs.length === 0) {
  console.error('Error 1: You are made of stupid!'
      + '\nPro-Tip: '
      + require('path').basename(process.argv[1]) + ' PLUG'
      + ' # PLUG ∈ {'
      + require('fs').readdirSync(__dirname + '/plugs').join(',')
      + '}^n, n ≥ 1');
  process.exit(23);
};

http.createServer(function (req, res) {
  return slurp(req, function (data) {
    try {
      var message = JSON.parse(data);
    } catch (exn) {
      console.error(exn.stack);
    };
    if (message) {
      plugs.forEach(function (plug) {

        var env = JSON.parse(JSON.stringify(process.env));
        Object.keys(message).forEach(function (key) {
          env[key] = message[key];
        });

        var child = spawn(__dirname + '/plugs/' + plug + '/index', [], {
          env: env
        });

        child.stdout.on('data', function (data) {
          console.log(plug, 'stdout:', data.toString());
        });

        child.stderr.on('data', function (data) {
          console.log(plug, 'stderr:', data.toString());
        });

        child.on('exit', function (code) {
          console.log(plug, 'exit:', code);
          if (code === 0) {
            res.writeHead(200, { 'Content-Length': 0 });
            res.end();
          } else {
            res.writeHead(500, { 'Content-Length': 0 });
            res.end();
          };
        });

      });
    } else {
      res.writeHead(400, 'You are made of stupid!', {
        'Content-Length': 0
      });
      res.end();
    };
  });
}).listen(port, host, function () {
  console.log('Serving HTTP on', host, 'port', port);
});