import { HowlOptions, Howl } from 'howler';
import { Ref, ComputedRef } from 'vue-demi';

interface HowlStatic {
    new (properties: HowlOptions): Howl;
}
type MaybeRef<T> = T | Ref<T> | ComputedRef<T>;
interface SpriteMap {
    [key: string]: [number, number];
}
type ComposableOptions = {
    volume?: MaybeRef<number>;
    playbackRate?: MaybeRef<number>;
    interrupt?: boolean;
    soundEnabled?: boolean;
    autoplay?: boolean;
    sprite?: SpriteMap;
    onload?: () => void;
} & Omit<HowlOptions, 'src'>;
interface PlayOptions {
    id?: number;
    forceSoundEnabled?: boolean;
    playbackRate?: number;
}
type PlayFunction = (options?: PlayOptions) => void;
interface ReturnedValue {
    play: PlayFunction;
    sound: Ref<Howl | null>;
    stop: (id?: number) => void;
    pause: (id?: number) => void;
    isPlaying: Ref<boolean>;
    duration: Ref<number | null>;
}

declare function useSound(url: MaybeRef<string>, { volume, playbackRate, soundEnabled, interrupt, autoplay, onload, ...delegated }?: ComposableOptions): ReturnedValue;

export { type ComposableOptions, type HowlStatic, type MaybeRef, type PlayFunction, type PlayOptions, type ReturnedValue, type SpriteMap, useSound };
