/* eslint-disable import/no-mutable-exports */
let perfMiddleware;

if (process.env.NODE_ENV !== 'production') {
  /**
   * Performance middleware for use with a Redux store.
   * Will log the time taken by every action across all
   * of the reducers of the store.
   */
  perfMiddleware = () => {
    /* eslint-disable no-console */
    /**
     * @param {Function} next - The next middleware in the chain.
     * @returns {Function} A function that takes an 'action'
     * and sends it through to the 'reducers'.
     */
    const middleware = (next) => (action) => {
      let result;

      if (console.time) {
        console.time(action.type);
        result = next(action);
        console.timeEnd(action.type);
      } else {
        result = next(action);
      }

      return result;
    };

    return middleware;
  };
}

export { perfMiddleware };
