/**
 * Processes queue that might have been set before
 * the script was actually loaded and reassigns
 * class over globalObject variable to execute commands
 * instead of putting them to the queue.
 */
import { getFunctionalInterface } from "./_getFunctionalInterface";
import type AlgoliaAnalytics from "./insights";

export function processQueue(this: AlgoliaAnalytics, globalObject: any): void {
  // Set pointer which allows renaming of the script
  const pointer = globalObject.AlgoliaAnalyticsObject as string;

  if (pointer) {
    const _aa = getFunctionalInterface(this);

    // `aa` is the user facing function, which is defined in the install snippet.
    //  - before library is initialized  `aa` fills a queue
    //  - after library is initialized  `aa` calls `_aa`
    const aa = globalObject[pointer];
    aa.queue = aa.queue || [];

    const queue: IArguments[] = aa.queue;

    // Loop queue and execute functions in the queue
    queue.forEach((args: IArguments) => {
      const [functionName, ...functionArguments] = [].slice.call(args);
      _aa(functionName as any, ...(functionArguments as any));
    });

    /* eslint-disable no-warning-comments */
    // FIXME: Reassigning the pointer is a bad idea (cf: https://github.com/algolia/search-insights.js/issues/127)
    //   to remove this without any breaking change, we redefine the Array.prototype.push method on the queue array.
    //   for next major version, use a custom method instead of push.
    /* eslint-enable */
    // @ts-expect-error (otherwise typescript won't let you change the signature)
    queue.push = (args: IArguments): number => {
      const [functionName, ...functionArguments] = [].slice.call(args);
      _aa(functionName as any, ...(functionArguments as any));
    };
  }
}