/* eslint-disable no-underscore-dangle */
/**
 * @exports
 * @typedef {Object} codeMessage
 * @prop {number} code
 * @prop {string} message
 */
/**
 * @exports
 * @typedef {Object} respObject
 * @prop {number} status
 * @prop {codeMessage} object
 */

/**
 * create respobject
 * @param {number} status
 * @param {codeMessage} codeMsg
 */

const mod = {};
module.exports = mod;

mod.respDefault = (status = 200, codeMsg) => ({ status, object: codeMsg });

mod.APIError = class extends Error {
  /**
   * @param {string} message
   * @param {respObject} resp
   */
  constructor(message = '', resp) {
    super(message);
    this._object = resp || {};
  }

  get object() {
    return this._object;
  }
};

/**
 * check response object struct
 * @param {respObject} v
 */
mod.checkStruct = v => {
  if (typeof v !== 'object' || v === null || v === undefined) return false;
  if (!('status' in v) || !('object' in v)) return false;
  if (typeof v.object !== 'object' || !('code' in v.object) || !('message' in v.object)) return false;
  return true;
};

mod.codeMessage = {
  CodeSuccess: { code: 1000, message: 'success' },
  CodeCreated: { code: 1001, message: 'created' },
  CodeAccepted: { code: 1002, message: 'accepted' },
  CodeDataFormat: { code: 1003, message: 'data format error' },
  CodeUnauthorized: { code: 1004, message: 'unauthorized' },
  CodeForbidden: { code: 1005, message: 'forbidden' },
  CodeNotFound: { code: 1006, message: 'not found' },
  CodeInternalError: { code: 1007, message: 'internal error' },
};

mod.resp = {
  Success: mod.respDefault(200, mod.codeMessage.CodeSuccess),
  Created: mod.respDefault(201, mod.codeMessage.CodeCreated),
  Accepted: mod.respDefault(202, mod.codeMessage.CodeAccepted),
  DataFormat: mod.respDefault(400, mod.codeMessage.CodeDataFormat),
  Unauthorized: mod.respDefault(401, mod.codeMessage.CodeUnauthorized),
  Forbidden: mod.respDefault(403, mod.codeMessage.CodeForbidden),
  NotFound: mod.respDefault(404, mod.codeMessage.CodeNotFound),
  InternalError: mod.respDefault(500, mod.codeMessage.CodeInternalError),
};
