/* eslint-disable no-console */
import type { Action } from '../../state/store-types';

interface Bucket {
  [key: string]: number[];
}

const average = (values: number[]): number => {
  const sum: number = values.reduce(
    (previous: number, current: number) => previous + current,
    0,
  );
  return sum / values.length;
};

export default (groupSize: number) => {
  console.log('Starting average action timer middleware');
  console.log(`Will take an average every ${groupSize} actions`);
  const bucket: Bucket = {};

  return () =>
    (next: (a: Action) => unknown) =>
    (action: Action): any => {
      const start: number = performance.now();

      const result: unknown = next(action);

      const end: number = performance.now();

      const duration: number = end - start;

      if (!bucket[action.type]) {
        bucket[action.type] = [duration];
        return result;
      }

      bucket[action.type].push(duration);

      if (bucket[action.type].length < groupSize) {
        return result;
      }

      console.warn(
        `Average time for ${action.type}`,
        average(bucket[action.type]),
      );

      // reset
      bucket[action.type] = [];

      return result;
    };
};
