import { useCallback, useRef } from "react";

import { type HowlLoadOptions } from "@/helpers/howler";

import useHowler from "./useHowler";

interface AudioLoadArguments {
  src?: string | string[];
  options?: HowlLoadOptions;
}

export default function useGlobalAudio() {
  const sequenceRef = useRef<AudioLoadArguments[]>([]);
  const currentIndexRef = useRef(0);
  const { load, play, stop } = useHowler();

  const playAudio = useCallback(
    (src?: string | string[], options?: HowlLoadOptions) => {
      if (!src) return;
      load(src, options);
      play();
    },
    [load, play],
  );

  const playNextInSequence = useCallback(() => {
    if (currentIndexRef.current < sequenceRef.current.length) {
      const audio = sequenceRef.current[currentIndexRef.current++];
      playAudio(audio.src, {
        ...audio.options,
        onend:
          currentIndexRef.current < sequenceRef.current.length
            ? playNextInSequence
            : undefined,
      });
    }
  }, [playAudio]);

  const playAudioSequence = useCallback(
    (sequence: AudioLoadArguments[]) => {
      if (!sequence || sequence.length === 0) return;

      sequenceRef.current = sequence;
      currentIndexRef.current = 0;
      playNextInSequence();
    },
    [playNextInSequence],
  );

  return {
    playAudio,
    playAudioSequence,
    stopAudio: stop,
  };
}
