import { DiscordGatewayAdapterCreator, VoiceConnection, AudioPlayer, AudioResource } from '@discordjs/voice';

interface VoiceAudioDataModel {
    /**
     * The unique identifier for the audio resource.
     */
    ResourceType: "Link" | "File";

    /**
     * The URL or file path of the audio resource.
     * any is to be assumed to require(filepath)
     */
    Resource: string | any;
}

interface VoiceConnectionDataModel {
    /**
     * The ID of the voice channel to connect to.
     */
    VoiceChannelId: number;

    /**
     * The Id of the guild (server) to connect to.
     */
    GuildId: number;

    /**
     * The adapter creator for the voice connection.
     * Can be archived by the guild instance via the voiceAdapterCreator property.
     */
    VoiceAdapter: DiscordGatewayAdapterCreator;
}

interface IAudioManager {
    OverrideOptions(connectionData?: VoiceConnectionDataModel | null, audioData?: VoiceAudioDataModel | null): void;
    CreateConnection(isRenew: boolean): void;
    PlayAudioOnConnection(): void;
    PauseAudio(): void;
    ResumeAudio(): void;
    StopAudioOnConnection(): void;
    CreateConnectionAndPlayAudio(): void;
    DestroyConnection(resetValidationParameters: boolean): void;
    SetVolume(volumeInPercent: number): void;
    SetMaxListeners(maxListeners: number): void;
}

declare class AudioManager implements IAudioManager {
    VoiceConnection: VoiceConnection | null;
    AudioPlayer: AudioPlayer | null;
    AudioResource: AudioResource | null;
    IsActive: boolean;
    IsAudioPlaying: boolean;
    ConnectionData: VoiceConnectionDataModel | null;
    AudioData: VoiceAudioDataModel | null;
    constructor(connectionData?: VoiceConnectionDataModel | null, audioData?: VoiceAudioDataModel | null);
    OverrideOptions(connectionData?: VoiceConnectionDataModel | null, audioData?: VoiceAudioDataModel | null): void;
    CreateConnection(isRenew?: boolean): void;
    PlayAudioOnConnection(): void;
    StopAudioOnConnection(): void;
    PauseAudio(): void;
    ResumeAudio(): void;
    CreateConnectionAndPlayAudio(): void;
    DestroyConnection(resetValidationParameters?: boolean): void;
    SetMaxListeners(maxListeners: number): void;
    SetVolume(volumeInPercent: number): void;
    private RenewConnectionAndAudio;
    private CheckIfNull;
}

export { AudioManager, type VoiceAudioDataModel, type VoiceConnectionDataModel };
