import { Logger } from 'homebridge';
import { LocalStorage } from 'node-persist';
import { AbsoluteToken, AccessTokenRefreshResponse, AccessTokenResponse, AuthorisationResponse, DeviceAccessTokenResponse, DeviceAuthorisationResponse } from './api-auth-types.js';
import { APIUserAgent, Method, Request } from './api-ua.js';
import { ConfigPlugin } from './config-types.js';
import { AuthHelp, AuthHelpMessage } from './api-ua-auth-help.js';
export interface AuthorisationStatusSuccess {
    state: 'busy' | 'success';
}
export interface AuthorisationStatusUser {
    state: 'user';
    uri: string;
    code: string;
    expires: number | null;
}
export interface AuthorisationStatusFailed {
    state: 'fail';
    retryable: boolean;
    error: unknown;
    message: string;
    help?: AuthHelpMessage;
}
export type AuthorisationStatus = AuthorisationStatusSuccess | AuthorisationStatusUser | AuthorisationStatusFailed;
export declare class AuthorisationRetry {
    readonly reason: string;
    constructor(reason: string);
}
export declare class APIAuthoriseUserAgent extends APIUserAgent {
    readonly persist: LocalStorage;
    private readonly refreshWindow;
    private readonly refreshRetryDelay;
    private readonly pollPersistDelay;
    private deviceFlowPollInterval;
    private deviceFlowLogInterval;
    private isAuthorised;
    private readonly triggerAuthorisationRetry;
    private triggerDeviceFlow?;
    private pollDeviceCode?;
    private triggerTokenRefresh?;
    private status;
    private statusUpdate;
    private triggerStatusUpdate?;
    private token?;
    constructor(log: Logger, config: ConfigPlugin, persist: LocalStorage, language: string);
    get scopes(): string[];
    authoriseUserAgent(): Promise<void>;
    maintainAccessToken(): Promise<never>;
    obtainAccessToken(): Promise<void>;
    refreshAccessToken(): Promise<void>;
    getSavedToken(): Promise<AbsoluteToken>;
    watchToken(oldToken?: AbsoluteToken): Promise<AuthorisationRetry>;
    saveToken(newToken: AccessTokenResponse | DeviceAccessTokenResponse | AccessTokenRefreshResponse): Promise<void>;
    loadTokens(): Promise<Map<string, AbsoluteToken>>;
    authorisationCodeGrantFlow(): Promise<AccessTokenResponse>;
    deviceFlow(): Promise<DeviceAccessTokenResponse>;
    retryDeviceFlow(reason?: string): void;
    setAuthorisationStatusFailed(err: unknown, retryable?: boolean, help?: AuthHelp): void;
    setAuthorisationStatus(status: AuthorisationStatus): void;
    getAuthorisationStatus(immediate?: boolean): Promise<AuthorisationStatus>;
    authorisationRequest(): Promise<AuthorisationResponse & {
        redirect_uri: string;
    }>;
    authorisationRequestURL(redirect_uri?: string): URL;
    parseAuthorisationResponse(url: URL | string): AuthorisationResponse;
    accessTokenRequest(code: string, redirect_uri?: string): Promise<AccessTokenResponse>;
    deviceAuthorisationRequest(): Promise<DeviceAuthorisationResponse>;
    deviceAccessTokenRequest(device_code: string): Promise<DeviceAccessTokenResponse>;
    accessTokenRefreshRequest(refresh_token: string): Promise<AccessTokenRefreshResponse>;
    get authorizationHeader(): string | undefined;
    prepareRequest(method: Method, path: string, options?: Partial<Request>): Promise<Request>;
    canRetry(err: unknown): boolean;
}
//# sourceMappingURL=api-ua-auth.d.ts.map