import type { GoogleOAuthConfig, GoogleOAuthState, GoogleAuthorizationParams, GoogleTokenRequest, GoogleTokenResponse, GoogleRefreshTokenRequest, GoogleRevokeTokenRequest, GoogleUserInfo, GoogleOAuthError, GoogleTokenInfo, GoogleScope } from "./types/google-oauth";
/**
 * Google OAuth2 Authentication Client
 *
 * Provides a chainable API for Google OAuth2 authentication flow.
 * Supports both standard OAuth2 and PKCE (Proof Key for Code Exchange) flows.
 * Works with all Google APIs including Calendar, Drive, Gmail, etc.
 *
 * @example
 * ```typescript
 * const googleAuth = GoogleOAuth({
 *   clientId: 'your-client-id.googleusercontent.com',
 *   clientSecret: 'your-client-secret',
 *   redirectUri: 'http://localhost:3000/auth/google/callback'
 * });
 *
 * // Generate authorization URL
 * const authUrl = googleAuth.getAuthorizationUrl({
 *   scope: ['email', 'profile', 'https://www.googleapis.com/auth/calendar'],
 *   state: 'random-state-string',
 *   accessType: 'offline' // for refresh tokens
 * });
 *
 * // Exchange code for token
 * const tokens = await googleAuth.exchangeCodeForToken(code);
 *
 * // Get user information
 * const user = await googleAuth.withToken(tokens.access_token).getUser();
 * ```
 */
export declare class GoogleOAuth {
    private config;
    private token?;
    constructor(config: GoogleOAuthConfig);
    /**
     * Set the access token for authenticated requests
     */
    withToken(token: string): GoogleOAuth;
    /**
     * Generate PKCE code verifier and challenge
     */
    generatePKCE(): {
        codeVerifier: string;
        codeChallenge: string;
    };
    /**
     * Generate the OAuth2 authorization URL
     *
     * @param options Configuration options for the authorization request
     * @param options.scope Array of scopes to request
     * @param options.state Random state parameter for CSRF protection
     * @param options.accessType 'offline' for refresh tokens, 'online' for access tokens only
     * @param options.includeGrantedScopes Include previously granted scopes
     * @param options.loginHint Email hint for the login screen
     * @param options.prompt Control the OAuth flow prompts
     * @param options.pkce Whether to use PKCE flow (returns code_verifier if true)
     */
    getAuthorizationUrl(options?: {
        scope?: GoogleScope[];
        state?: string;
        accessType?: 'online' | 'offline';
        includeGrantedScopes?: boolean;
        loginHint?: string;
        prompt?: 'none' | 'consent' | 'select_account';
        pkce?: boolean;
    }): {
        url: string;
        codeVerifier?: string;
    };
    /**
     * Exchange authorization code for access token
     *
     * @param code Authorization code received from Google
     * @param codeVerifier Code verifier for PKCE flow
     */
    exchangeCodeForToken(code: string, codeVerifier?: string): Promise<GoogleTokenResponse>;
    /**
     * Refresh an existing access token using a refresh token
     */
    refreshToken(refreshToken: string): Promise<GoogleTokenResponse>;
    /**
     * Revoke an access token or refresh token
     */
    revokeToken(token?: string): Promise<void>;
    /**
     * Get authenticated user information from Google's userinfo endpoint
     */
    getUser(): Promise<GoogleUserInfo>;
    /**
     * Get information about the current access token
     */
    getTokenInfo(): Promise<GoogleTokenInfo>;
    /**
     * Check if the current token is valid
     */
    validateToken(): Promise<boolean>;
    /**
     * Get the scopes associated with the current token
     */
    getTokenScopes(): Promise<string[]>;
    /**
     * Create a complete user profile with user info and token details
     */
    getCompleteProfile(): Promise<{
        user: GoogleUserInfo;
        tokenInfo: GoogleTokenInfo;
        scopes: string[];
    }>;
    /**
     * Check if the token has a specific scope
     */
    hasScope(scope: string): Promise<boolean>;
    /**
     * Check if the token has all the required scopes
     */
    hasScopes(requiredScopes: string[]): Promise<boolean>;
    /**
     * Get the remaining time until token expiration (in seconds)
     */
    getTokenExpirationTime(): Promise<number>;
    /**
     * Check if the token is expired or will expire within the given seconds
     */
    isTokenExpired(bufferSeconds?: number): Promise<boolean>;
}
/**
 * Factory function to create a Google OAuth instance
 *
 * @param config OAuth configuration
 * @returns GoogleOAuth instance
 */
export declare function createGoogleOAuth(config: GoogleOAuthConfig): GoogleOAuth;
/**
 * Functional factory for Google OAuth - preferred pattern
 *
 * @param config OAuth configuration
 * @returns GoogleOAuth instance
 */
export declare function googleOAuth(config: GoogleOAuthConfig): GoogleOAuth;
export type { GoogleOAuthConfig, GoogleOAuthState, GoogleAuthorizationParams, GoogleTokenRequest, GoogleTokenResponse, GoogleRefreshTokenRequest, GoogleRevokeTokenRequest, GoogleUserInfo, GoogleOAuthError, GoogleTokenInfo, GoogleScope, };
//# sourceMappingURL=oauth.d.ts.map