/*
 * feathers-errors
 * https://github.com/feathersjs/feathers-errors
 *
 * Copyright (c) 2014 Eric Kryski
 * Licensed under the MIT license.
 */

'use strict';

var _ = require('lodash');
var errors = require('./error-types');

exports = module.exports = function () {
  return function () {
    var app = this;

    // Enable the errors Plugin
    app.enable('feathers errors');

    // Set the available errors on the app for convenience
    app.errors = errors;
  };
};

exports.types = errors;

/**
 * Convenience method for a 404 middleware
 * See http://expressjs.com/guide.html#error-handling
 * @param  {Error} err - An error
 * @param  {Object} req - the request object
 * @param  {Object} res - the response object
 * @param  {Function} next - callback to call for next step in middleware chain
 */
exports.missing = function(req, res, next) {
  next(new errors.NotFound('Page not found.'));
};

/**
 * The error handler middleware.
 * See http://expressjs.com/guide.html#error-handling
 * @param  {Error} err - An error
 * @param  {Object} req - the request object
 * @param  {Object} res - the response object
 * @param  {Function} next - callback to call for next step in middleware chain
 *
 */

/* jshint unused:false */
exports.handler = function(err, req, res, next) {
  if (typeof err === 'string' || !(err instanceof errors.AbstractError)) {
    err = new errors.GeneralError(err);
  }

  var statusCode = typeof err.code === 'number' ? err.code : 500;

  res.status(statusCode);

  if (req.app.log === 'function') {
    req.app.log(req.url, err.stack || err);
  }

  res.format({
    'text/html': function(){
      if(req.app.settings.env === 'development') {
        return res.send(err);
      }

      var errorPath = req.app.get('redirect') + err.className;
      res.redirect(errorPath);
    },

    'application/json': function(){
      res.json(_.pick(err, 'message', 'name', 'code', 'className'));
    },

    'text/plain': function(){
      res.send(err.message);
    }
  });
};
/*
 * feathers-errors
 * https://github.com/feathersjs/feathers-errors
 *
 * Copyright (c) 2014 Eric Kryski
 * Licensed under the MIT license.
 */

'use strict';

var _ = require('lodash');
var errors = require('./error-types');

exports = module.exports = function () {
  return function () {
    var app = this;

    // Enable the errors Plugin
    app.enable('feathers errors');

    // Set the available errors on the app for convenience
    app.errors = errors;
  };
};

exports.types = errors;

/**
 * Convenience method for a 404 middleware
 * See http://expressjs.com/guide.html#error-handling
 * @param  {Error} err - An error
 * @param  {Object} req - the request object
 * @param  {Object} res - the response object
 * @param  {Function} next - callback to call for next step in middleware chain
 */
exports.missing = function(req, res, next) {
  next(new errors.NotFound('Page not found.'));
};

/**
 * The error handler middleware.
 * See http://expressjs.com/guide.html#error-handling
 * @param  {Error} err - An error
 * @param  {Object} req - the request object
 * @param  {Object} res - the response object
 * @param  {Function} next - callback to call for next step in middleware chain
 *
 */

/* jshint unused:false */
exports.handler = function(err, req, res, next) {
  if (typeof err === 'string' || !(err instanceof errors.AbstractError)) {
    err = new errors.GeneralError(err);
  }

  var statusCode = typeof err.code === 'number' ? err.code : 500;

  res.status(statusCode);

  if (req.app.log === 'function') {
    req.app.log(req.url, err.stack || err);
  }

  res.format({
    'text/html': function(){
      if(req.app.settings.env === 'development') {
        return res.send(err);
      }

      if (err.code === 404) {
        res.redirect('/404');
      }

      res.redirect('/500');
    },

    'application/json': function(){
      res.json(_.pick(err, 'message', 'name', 'code', 'className'));
    },

    'text/plain': function(){
      res.send(err.message);
    }
  });
};
fix html error handling. Redirect to /404 or /500