var fs = require('fs');
var Q = require('q');
var spawn = require('child_process').spawn;
var path = require('path');

// Make sure you append the path with the lambda deployment path, so you can 
// execute your own binaries in, say, bin/
process.env["PATH"] = process.env["PATH"] + ":" + process.env["LAMBDA_TASK_ROOT"] + '/bin/';

function spawnCmd(cmd, args, opts) {
  var opts = opts||{};
  var basename = path.basename(cmd);

  console.log("[spawn]", cmd, args.join(' '), opts);

  var deferred = Q.defer();
  child = spawn(cmd, args, opts);
  child.stdout.on('data', function(chunk) {
    console.log("[" + basename + ":stdout] " + chunk);
  });

  child.stderr.on('data', function(chunk) {
    console.log("[" + basename + ":stderr] " + chunk);
  });
  child.on('error', function (error) {
    console.log("[" + basename + "] unhandled error:",error);
    deferred.reject(new Error(error));
  });
  child.on('close', function (code, signal) {
    if(signal) {
      deferred.reject("Process killed with signal " + signal);
    } else if(code==0) {
      deferred.resolve(code);
    } else {
      deferred.reject("Process exited with code " + code);
    }
    console.log("[" + basename + "] child process exited with code",code, "signal", signal);
  });

  return deferred.promise;
}

exports.handler = function(event, context) {
  spawnCmd("/usr/bin/uname", ["-a"], {
      cwd: '/tmp'
  }).then(function(result) {
    context.succeed(result);
  }, function(err) {
    context.fail(err);
  });
}