'use strict'

// error messages can be strings of objects
exports['default'] = {
  errors: (api) => {
    return {
      '_toExpand': false,

      // ///////////////
      // SERIALIZERS //
      // ///////////////

      serializers: {
        servers: {
          web: (error) => {
            if (error.message) {
              return String(error.message)
            } else {
              return error
            }
          },
          websocket: (error) => {
            if (error.message) {
              return String(error.message)
            } else {
              return error
            }
          },
          socket: (error) => {
            if (error.message) {
              return String(error.message)
            } else {
              return error
            }
          },
          specHelper: (error) => {
            if (error.message) {
              return 'Error: ' + String(error.message)
            } else {
              return error
            }
          }
        }
      },

      // ///////////
      // ACTIONS //
      // ///////////

      // When a params for an action is invalid
      invalidParams: (data, validationErrors) => {
        if (validationErrors.length >= 0) { return validationErrors[0] }
        return data.connection.localize('actionhero.errors.invalidParams')
      },

      // When a required param for an action is not provided
      missingParams: (data, missingParams) => {
        return data.connection.localize(['actionhero.errors.missingParams', {param: missingParams[0]}])
      },

      // user requested an unknown action
      unknownAction: (data) => {
        return data.connection.localize('actionhero.errors.unknownAction')
      },

      // action not useable by this client/server type
      unsupportedServerType: (data) => {
        return data.connection.localize(['actionhero.errors.unsupportedServerType', {type: data.connection.type}])
      },

      // action failed because server is mid-shutdown
      serverShuttingDown: (data) => {
        return data.connection.localize('actionhero.errors.serverShuttingDown')
      },

      // action failed because this client already has too many pending acitons
      // limit defined in api.config.general.simultaneousActions
      tooManyPendingActions: (data) => {
        return data.connection.localize('actionhero.errors.tooManyPendingActions')
      },

      dataLengthTooLarge: (maxLength, receivedLength) => {
        return api.i18n.localize(['actionhero.errors.dataLengthTooLarge', {maxLength: maxLength, receivedLength: receivedLength}])
      },

      // ///////////////
      // FILE SERVER //
      // ///////////////

      // The body message to accompany 404 (file not found) errors regarding flat files
      // You may want to load in the contnet of 404.html or similar
      fileNotFound: (connection) => {
        return connection.localize(['actionhero.errors.fileNotFound'])
      },

      // user didn't request a file
      fileNotProvided: (connection) => {
        return connection.localize('actionhero.errors.fileNotProvided')
      },

      // something went wrong trying to read the file
      fileReadError: (connection, error) => {
        return connection.localize(['actionhero.errors.fileReadError', {error: String(error)}])
      },

      // ///////////////
      // CONNECTIONS //
      // ///////////////

      verbNotFound: (connection, verb) => {
        return connection.localize(['actionhero.errors.verbNotFound', {verb: verb}])
      },

      verbNotAllowed: (connection, verb) => {
        return connection.localize(['actionhero.errors.verbNotAllowed', {verb: verb}])
      },

      connectionRoomAndMessage: (connection) => {
        return connection.localize('actionhero.errors.connectionRoomAndMessage')
      },

      connectionNotInRoom: (connection, room) => {
        return connection.localize(['actionhero.errors.connectionNotInRoom', {room: room}])
      },

      connectionAlreadyInRoom: (connection, room) => {
        return connection.localize(['actionhero.errors.connectionAlreadyInRoom', {room: room}])
      },

      connectionRoomHasBeenDeleted: (room) => {
        return api.i18n.localize('actionhero.errors.connectionRoomHasBeenDeleted')
      },

      connectionRoomNotExist: (room) => {
        return api.i18n.localize('actionhero.errors.connectionRoomNotExist')
      },

      connectionRoomExists: (room) => {
        return api.i18n.localize('actionhero.errors.connectionRoomExists')
      },

      connectionRoomRequired: (room) => {
        return api.i18n.localize('actionhero.errors.connectionRoomRequired')
      }

    }
  }
}
