import request from 'request';
import ExpandedEventEmitter from './ExpandedEventEmitter';
interface APIOptionsParam {
    /** Your API application client id */
    clientID?: string;
    /** Your API application client secret */
    clientSecret?: string;
    /** Your API application redirect Oauth URL */
    redirectURL?: string;
    /**
     * Refresh token if you need to do authorized requests.
     * It will use this to generate new accessTokens if it has none or they become expired.
     */
    refreshToken?: string;
    /** Your access token. If you already have an access token refresh */
    accessToken?: string;
    /**
     * The timestamp of when the access token expires.
     * Requests after this timestamp will cause a token refresh first, given that autoRefreshToken is true.
     * Defaults to null (will not refresh token based on expired).
     */
    accessTokenExpireTS?: number;
    /** If the api should automatically refresh access token if getting an unauthorized error. Defaults to true */
    autoRefreshToken?: boolean;
    /** If should validate token on construction. Defaults to true */
    validateToken?: boolean;
    /** The Twitch API url. Defaults to "https://api.twitch.tv/" */
    apiURL?: string;
    /** The Twitch authentication url. Defaults to "https://id.twitch.tv/" */
    authURL?: string;
}
interface APIOptions {
    clientID: string | null;
    clientSecret: string | null;
    redirectURL: string | null;
    refreshToken: string | null;
    accessToken: string | null;
    accessTokenExpireTS: number | null;
    autoRefreshToken: boolean;
    validateToken: boolean;
    apiURL: string;
    authURL: string;
}
declare type RequestCallback = (err: any, data?: {} | any, res?: request.Response, body?: any) => void;
interface RequestOptionsMethod extends RequestOptions {
    method: 'GET' | 'POST' | 'DELETE' | 'PUT' | 'HEAD';
}
interface RequestOptions {
    /** The API endpoint. Example: "streams" */
    url: string;
    /** The base URL to use. Defaults to constructor option apiURL */
    baseURL?: string;
    /** Replacement clientID, use null to not set. Defaults to constructor option clientID */
    clientID?: string;
    /** Replacement accessToken, use null to not set. Defaults to constructor option accessToken */
    accessToken?: string;
    /** The access token prefix. Defaults to "OAuth" for kraken calls and "Bearer" for other */
    accessTokenPrefix?: string;
}
interface TwitchAPI {
    addListener(event: string, listener: (...args: any[]) => void): this;
    /** When an error has happened */
    addListener(event: 'error', listener: (error: any) => void): this;
    /** When a debug message happens */
    addListener(event: 'debug', listener: (...message: any) => void): this;
    /** When the access token has been validated */
    addListener(event: 'tokenvalidate', listener: (data: any) => void): this;
    /** When the access token has been refreshed */
    addListener(event: 'tokenrefresh', listener: (data: any) => void): this;
    on(event: string, listener: (...args: any[]) => void): this;
    /** When an error has happened */
    on(event: 'error', listener: (error: any) => void): this;
    /** When a debug message happens */
    on(event: 'debug', listener: (...message: any) => void): this;
    /** When the access token has been validated */
    on(event: 'tokenvalidate', listener: (data: any) => void): this;
    /** When the access token has been refreshed */
    on(event: 'tokenrefresh', listener: (data: any) => void): this;
    once(event: string, listener: (...args: any[]) => void): this;
    /** When an error has happened */
    once(event: 'error', listener: (error: any) => void): this;
    /** When a debug message happens */
    once(event: 'debug', listener: (...message: any) => void): this;
    /** When the access token has been validated */
    once(event: 'tokenvalidate', listener: (data: any) => void): this;
    /** When the access token has been refreshed */
    once(event: 'tokenrefresh', listener: (data: any) => void): this;
    emit(event: string, ...args: any[]): boolean;
    emit(event: 'error', error: any): boolean;
    emit(event: 'debug', ...message: any): boolean;
    emit(event: 'tokenvalidate', data: any): boolean;
    emit(event: 'tokenrefresh', data: any): boolean;
}
declare class TwitchAPI extends ExpandedEventEmitter {
    options: APIOptions;
    tokenData: any;
    constructor(options?: APIOptionsParam | string);
    private _getAuthHeaders;
    private _jsonTwitchBody;
    /**
     * Will refresh the internal access token.
     * Requires clientID, clientSecret and refreshToken in constructor options.
     * @param callback Callback for when the access token has been refreshed
     */
    refreshAccessToken(callback?: (err: any) => void): void;
    request(options: RequestOptionsMethod, callback?: RequestCallback, recursive?: boolean): void;
    /**
     * Runs an oauth validate access token from Twitch
     * @param callback The callback for the Twitch data sent back
     */
    validateAccessToken(callback?: (err: any, data?: any) => void): void;
    get(urlOrOptions: RequestOptions | string, callback?: RequestCallback): void;
    post(urlOrOptions: RequestOptions | string, callback?: RequestCallback): void;
    delete(urlOrOptions: RequestOptions | string, callback?: RequestCallback): void;
    put(urlOrOptions: RequestOptions | string, callback?: RequestCallback): void;
    /**
     * Get OAuth Authorization Code Flow url that clients need to login with.
     * Remember to add state query to the url.
     * Requires clientID and redirectURL in construction parameters
     * When the user has logged in, they will be redirected to:
     * https://<your registered redirect URI>/?code=<authorization code>
     * You can then use that code to get a refresh token with:
     * getRefreshToken(<authorization code>, callback..)
     * @param scopes List of scopes to be in authorization url
     */
    getAuthenticationURL(...scopes: string[]): string;
    /**
     * Get a refresh token from an authorization process.
     * Use getAuthenticationURL() to get the url the user needs to login at.
     * @param authCode The authorization code gotten from redirect URL query
     * @param callback Callback for the information Twitch sends back
     */
    getRefreshToken(authCode: string, callback: RequestCallback): void;
}
export = TwitchAPI;
