// 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 errorMap = require('../runtime/error-map');
var inherits = require('inherits');
var defaultCatalog = require('../runtime/default-catalog');
var VanadiumError = require('./vanadium-error');

module.exports = makeError;

/**
 * Returns a constructor that represents the error id
 * and retryCode passed in.
 * @param {string} id The unique id for this error type.  It is preferable
 * to prefix the error name with a package path that is unique.
 * @param {module:vanadium.verror.actions} retryCode The retry action for this
 * error.
 * @param {string|object} format If a string, then it's the en-US text string,
 * otherwise it is a map from languageId to format string.
 * @param {Array} types The array of types that expected for the arguments to
 * the error constructor.
 * @returns {function} A constructor function that can be used to create
 * vanadium errors with the given error id.  The returned constructor function
 * inherits from {@link module:vanadium.verror.VanadiumError}.
 * @memberof module:vanadium.verror
 */
function makeError(id, retryCode, format, types) {
  var fname = id.split('.').pop();
  var Errors = {};
  Errors[fname] = function() {
    var args = Array.prototype.slice.call(arguments);
    if (Array.isArray(args[0]) && args.length === 1) {
      args = args[0];
    }
    if (!(this instanceof Errors[fname])) {
      return new Errors[fname](args);
    }
    args.unshift(retryCode);
    args.unshift(id);
    VanadiumError.apply(this, args);
  };
  inherits(Errors[fname], VanadiumError);
  Errors[fname].prototype._argTypes = types || [];
  errorMap[id] = Errors[fname];
  if (typeof format === 'string') {
    format = {
      'en-US': format
    };
  }

  if (format) {
    var keys = Object.keys(format);
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      defaultCatalog.setWithBase(key, id, format[key]);
    }
  }
  return Errors[fname];
}
