/**
 * Copyright(c) dead_horse and other contributors.
 * MIT Licensed
 *
 * Authors:
 * 	 dead_horse <dead_horse@qq.com>
 *   fengmk2 <fengmk2@gmail.com> (http://fengmk2.com)
 */

'use strict';

/**
 * Module dependencies.
 */

var ready = require('get-ready');
var EventEmitter = require('events').EventEmitter;
var util = require('util');

module.exports = Base;

function Base() {
  EventEmitter.call(this);
  this.on('error', this.defaultErrorHandler.bind(this));
}

/**
 * inherits from EventEmitter
 */

util.inherits(Base, EventEmitter);

ready.mixin(Base.prototype);

Base.prototype.defaultErrorHandler = function (err) {
  if (this.listeners('error').length > 1) {
    // ignore defaultErrorHandler
    return;
  }
  console.error('\n[%s][pid: %s][%s][%s] %s: %s \nError Stack:\n  %s',
    Date(), process.pid, this.constructor.name, __filename, err.name,
    err.message, err.stack);

  // try to show addition property on the error object
  // e.g.: `err.data = {url: '/foo'};`
  var additions = [];
  for (var key in err) {
    if (key === 'name' || key === 'message') {
      continue;
    }

    additions.push(util.format('  %s: %j', key, err[key]));
  }
  if (additions.length) {
    console.error('Error Additions:\n%s', additions.join('\n'));
  }
  console.error();
};