import { EventEmitter } from "events";
import {
  Track,
  Awaitable,
  playdlEvents,
  scrapperOptions,
  queue,
  Album,
} from "./instances";

export class playdl extends EventEmitter {
  public constructor(__scrapperOptions: scrapperOptions);
  public readonly __scrapperOptions: scrapperOptions;
  public readonly queues: Map<string, queue>;
  public exec(
    rawQuery: string,
    __scrapperOptions?: scrapperOptions
  ): Promise<queue>;
  public streamExtractor(
    rawQuery: string,
    __scrapperOptions?:
      | scrapperOptions
      | "streamDownload object key will always be true",
    returnType?: string | "tracks" | "streams"
  ): Promise<queue>;
  public softExtractor(
    rawQuery: string,
    __scrapperOptions?:
      | scrapperOptions
      | "streamDownload and fetcLyrics object key will always be false"
  ): Promise<queue>;
  public static playdlQuick: playdl;
  public on<K extends keyof playdlEvents>(
    event: K,
    listener: (...args: playdlEvents[K]) => Awaitable<void>
  ): this;
  public on<S extends string | symbol>(
    event: Exclude<S, keyof playdlEvents>,
    listener: (...args: any[]) => Awaitable<void>
  ): this;
}

export type playdlQuick = playdl;
declare var core: {
  playdl: playdl;
  playdlQuick: playdlQuick;
  queue: queue;
  Track: Track;
  Album: Album;
};
export default core;
export { queue, Track, Album };
