// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

var path = require('path');
var spawn = require('child_process').spawn;
var inherits = require('util').inherits;
var EE = require('events').EventEmitter;
var extend = require('xtend');
var which = require('which');
var PassThrough = require('stream').PassThrough;
var fs = require('fs');

var V23_ROOT = process.env.V23_ROOT;
var VANADIUM_BINS = [
  path.join(V23_ROOT, 'release/javascript/core/go/bin'),
  path.join(V23_ROOT, 'release/javascript/core/nacl/scripts')
];
var DEFAULT_FLAGS = {
  v: 3,
  log_dir: path.resolve('tmp/log')  // jshint ignore:line
};

process.env.PATH += ':' + VANADIUM_BINS.join(':');

module.exports = Service;

function Service(name, env) {
  if (!(this instanceof Service)) {
    return new Service(name, env);
  }

  var service = this;

  EE.call(service);

  try {
    service.config = require('./config-' + name);
  } catch (e) {
    service.config = {};
  }

  service.name = name;
  service.args = flags(extend(DEFAULT_FLAGS, service.config.flags));
  service.env = env || {};
}

inherits(Service, EE);

Service.prototype.spawn = function(args) {
  var service = this;

  args = args || service.args;

  if (!V23_ROOT) {
    var err = new Error('Please export $V23_ROOT to proceed');
    return service.emit('error', err);
  }

  which(service.name, function(err, bin) {
    if (err) {
      return service.emit('error', notfound(service.name));
    }

    var errlog = '';

    service.process = spawn(bin, args, {env: service.env});

    if (service.name !== 'servicerunner') {
        service.emit('ready');
    }

    if (service.process.stdout) {
      service.process.stdout.pipe(fs.createWriteStream(
        path.join('tmp', service.name + '.stdout.log')));

      if (service.name === 'servicerunner') {
        service.process.stdout.on('data', function(data) {
          service.emit('vars', JSON.parse(data.toString()));
          service.emit('ready');
        });
      }
    }

    // Buffer stderr until close so that a meaningful error can be emitted
    // when a non-zero exit code is encountered.
    //
    // NOTE: All vanadium bins log to stderr so this buffer will just grow
    // until that is resolved...
    if (service.process.stderr) {
      var stderr = new PassThrough();
      service.process.stderr.pipe(stderr);
      stderr.pipe(fs.createWriteStream(
        path.join('tmp', service.name + '.stderr.log')));

      stderr.on('data', function(data) {
        errlog += data;
      });
    }

    service.process.on('close', function(code) {
      if (code === 0) {
        return;
      }

      var message = [
        'non-zero exit code: ' + code,
        'while running: ' + service.name + ' ' + args.join(' '),
        '\n',
        errlog
      ].join('\n');

      service.emit('error', new Error(message));
    });

    [ 'exit', 'close' ].forEach(function(name) {
        service.process.on(name, service.emit.bind(service, name));
    });

    service.emit('spawn', service.process.stdout, service.process.stderr);
  });
};

// A quick wrapper for short run execs, useful for non-deamons like the
// principal command.
Service.prototype.exec = function(command, cb) {
  var service = this;
  service
    .on('error', cb.bind(service))
    .on('spawn', cb.bind(service, null))
    .spawn(command.split(' '));
};

Service.prototype.kill = function() {
  var service = this;

  if (service.process) {
    service.process.kill.apply(service.process, arguments);
  }
};

function notfound(name) {
  var message = 'Vanadium binary not found: ' + name + '\n' +
      'Please run "make clean" and try again.' +
      'If problem persists, "make go/bin -B" can force building of binaries.';

  return new Error(message);
}

function flags(obj) {
  var args = Object.keys(obj).map(function(key) {
    return ['-', key, '=', obj[key]].join('');
  });

  return args;
}
