import { Options, PlayOptions } from '@pixi/sound';

interface SoundOptions extends Omit<Options, "complete" | "loaded" | "sprites" | "source"> {
}
interface SoundPlayOptions extends Omit<PlayOptions, "complete" | "loaded"> {
}

type DistortionFilter = {
    type: "DistortionFilter";
    amount?: number;
};
type EqualizerFilter = {
    type: "EqualizerFilter";
    f32?: number;
    f64?: number;
    f125?: number;
    f250?: number;
    f500?: number;
    f1k?: number;
    f2k?: number;
    f4k?: number;
    f8k?: number;
    f16k?: number;
};
type MonoFilter = {
    type: "MonoFilter";
};
type ReverbFilter = {
    type: "ReverbFilter";
    seconds?: number;
    decay?: number;
    reverse?: boolean;
};
type StereoFilter = {
    type: "StereoFilter";
    pan?: number;
};
type StreamFilter = {
    type: "StreamFilter";
};
type TelephoneFilter = {
    type: "TelephoneFilter";
};
type SoundFilterMemory = DistortionFilter | EqualizerFilter | MonoFilter | ReverbFilter | StereoFilter | StreamFilter | TelephoneFilter;

interface ExportedSound {
    options: SoundOptions;
    filters?: SoundFilterMemory[];
}
interface SoundPlay {
    stepIndex: number;
    paused: boolean;
    options?: SoundPlayOptions | string;
}
interface ExportedSoundPlay extends SoundPlay {
    sound: ExportedSound;
}
/**
 * Interface exported sounds
 */
interface SoundGameState {
    soundAliasesOrder: string[];
    filters?: SoundFilterMemory[];
    soundsPlaying: {
        [key: string]: ExportedSoundPlay;
    };
    /**
     * @deprecated
     */
    playInStepIndex?: {
        [key: string]: SoundPlay;
    };
    /**
     * @deprecated
     */
    sounds?: ExportedSoundOld;
}
interface ExportedSoundOld {
    [key: string]: {
        options: SoundOptions;
        filters?: SoundFilterMemory[];
    };
}

export type { ExportedSound as E, SoundGameState as S, SoundOptions as a, SoundPlayOptions as b, SoundFilterMemory as c, SoundPlay as d };
