'use strict';
var CLASS_NAME = 'DataPortalError';
var util = require('util');
var Argument = require('../system/argument-check.js');
var DataPortalAction = require('./data-portal-action.js');
var t = require('../locales/i18n-bo.js')(CLASS_NAME);
/**
 * @classdesc Represents a data portal error error.
 * @description Creates a data portal error object.
 *
 * @memberof bo.shared
 * @constructor
 * @param {string} modeltype - The type of the model the error occurred in.
 * @param {string} modelName - The name of the model the error occurred in.
 * @param {bo.shared.DataPortalAction} action - The data portal action the error occurred in.
 * @param {error} interceptedError - The error to be wrapped.
 *
 * @extends {Error}
 * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error Error} for further information.
 *
 * @throws {@link bo.system.ArgumentError Argument error}: The model type must be a non-empty string.
 * @throws {@link bo.system.ArgumentError Argument error}: The model name must be a non-empty string.
 * @throws {@link bo.system.ArgumentError Argument error}: The action must be a DataPortalAction object.
 */
function DataPortalError (modeltype, modelName, action, interceptedError) {
  Error.call(this);
  var check = Argument.inConstructor(CLASS_NAME);
  /**
   * The name of the error type.
   * @type {string}
   * @default DataPortalError
   */
  this.name = this.constructor.name;
  /**
   * The type of the model the intercepted error occurred in.
   * @type {string}
   */
  this.modelType = check(modeltype).forMandatory('modeltype').asString();
  /**
   * The name of the model the intercepted error occurred in.
   * @type {string}
   */
  this.modelName = check(modelName).forMandatory('modelName').asString();
  /**
   * The name of the action executing that the intercepted error occurred in.
   * @type {string}
   */
  this.action = DataPortalAction.getName(
      check(action).for('action').asEnumMember(DataPortalAction, null)
  );
  /**
   * The intercepted error of the data portal action.
   * @type {error}
   */
  this.innerError = interceptedError;
  /**
   * Human-readable description of the error.
   * @type {string}
   */
  this.message = t.call(this, this.action, modelName);
}
util.inherits(DataPortalError, Error);
module.exports = DataPortalError;