import { createSpotifyAuth, isTokenExpired, SPOTIFY_SCOPES, shouldRefreshToken } from "./auth";
import type { TChainableClient, TRequestOptions, TSpotifyClientConfig } from "./services/spotify-client";
import type { TSpotifyAlbum, TSpotifyArtist, TSpotifyAudioAnalysis, TSpotifyAudioFeatures, TSpotifyAuthenticationError, TSpotifyConfig, TSpotifyContext, TSpotifyExternalUrls, TSpotifyFollowers, TSpotifyImage, TSpotifyPagingObject, TSpotifyPlaybackState, TSpotifyPlayerDevice, TSpotifyPlaylist, TSpotifyPlaylistTrack, TSpotifyRecentlyPlayedItem, TSpotifyRecentlyPlayedResponse, TSpotifyScope, TSpotifySearchResult, TSpotifySection, TSpotifySegment, TSpotifyTimeInterval, TSpotifyTokenResponse, TSpotifyTrack, TSpotifyUser } from "./types";
type TSpotify = {
    api: TChainableClient;
    user(userId: string): TUserClient;
    me: TAuthenticatedUserClient;
    player: TPlayerClient;
    playlist(playlistId: string): TPlaylistClient;
    search: TSearchClient;
    library: TLibraryClient;
};
type TUserClient = {
    get(): Promise<TSpotifyUser>;
    playlists: {
        get(options?: TRequestOptions): Promise<TSpotifyPagingObject<TSpotifyPlaylist>>;
    };
    chain: TChainableClient;
};
type TAuthenticatedUserClient = {
    get(): Promise<TSpotifyUser>;
    playlists: {
        get(options?: TRequestOptions): Promise<TSpotifyPagingObject<TSpotifyPlaylist>>;
    };
    tracks: {
        get(options?: TRequestOptions): Promise<TSpotifyPagingObject<TSpotifyTrack>>;
    };
    albums: {
        get(options?: TRequestOptions): Promise<TSpotifyPagingObject<TSpotifyAlbum>>;
    };
    artists: {
        get(options?: TRequestOptions): Promise<TSpotifyPagingObject<TSpotifyArtist>>;
    };
    recentlyPlayed: {
        get(options?: TRequestOptions): Promise<TSpotifyRecentlyPlayedResponse>;
    };
    chain: TChainableClient;
};
type TPlayerClient = {
    devices(): Promise<{
        devices: TSpotifyPlayerDevice[];
    }>;
    currentlyPlaying(): Promise<TSpotifyPlaybackState>;
    chain: TChainableClient;
};
type TPlaylistClient = {
    get(): Promise<TSpotifyPlaylist>;
    tracks: {
        get(options?: TRequestOptions): Promise<TSpotifyPagingObject<TSpotifyPlaylistTrack>>;
    };
    chain: TChainableClient;
};
type TSearchClient = {
    tracks(query: string, options?: TRequestOptions): Promise<TSpotifySearchResult>;
    artists(query: string, options?: TRequestOptions): Promise<TSpotifySearchResult>;
    albums(query: string, options?: TRequestOptions): Promise<TSpotifySearchResult>;
    playlists(query: string, options?: TRequestOptions): Promise<TSpotifySearchResult>;
    shows(query: string, options?: TRequestOptions): Promise<TSpotifySearchResult>;
    episodes(query: string, options?: TRequestOptions): Promise<TSpotifySearchResult>;
    chain: TChainableClient;
};
type TLibraryClient = {
    savedTracks: {
        get(options?: TRequestOptions): Promise<TSpotifyPagingObject<TSpotifyTrack>>;
    };
    savedAlbums: {
        get(options?: TRequestOptions): Promise<TSpotifyPagingObject<TSpotifyAlbum>>;
    };
    savedShows: {
        get(options?: TRequestOptions): Promise<TSpotifyPagingObject<unknown>>;
    };
    savedEpisodes: {
        get(options?: TRequestOptions): Promise<TSpotifyPagingObject<unknown>>;
    };
    chain: TChainableClient;
};
/**
 * Creates a new Spotify Web API client
 *
 * @param config - Configuration for the Spotify client
 * @param config.token - Spotify access token from OAuth 2.0 flow (required)
 * @param config.baseUrl - Custom Spotify API URL (default: https://api.spotify.com/v1)
 * @param config.cache - Enable response caching (default: false)
 * @param config.cacheTTL - Cache time-to-live in milliseconds (default: 300000)
 * @param config.timeout - Request timeout in milliseconds (default: 30000)
 *
 * @returns Spotify client instance with access to user data, playlists, player controls, and search
 *
 * @example
 * ```typescript
 * const spotify = Spotify({
 *   token: process.env.SPOTIFY_ACCESS_TOKEN,
 *   cache: true
 * });
 *
 * // Get current user profile
 * const user = await spotify.me.get();
 *
 * // Search for tracks
 * const tracks = await spotify.search.tracks('bohemian rhapsody');
 *
 * // Control playback
 * await spotify.player.play({ uris: ['spotify:track:4iV5W9uYEdYUVa79Axb7Rh'] });
 *
 * // Get user's playlists
 * const playlists = await spotify.me.playlists.get();
 * ```
 */
declare function Spotify(config: TSpotifyClientConfig): TSpotify;
export { Spotify, SPOTIFY_SCOPES, createSpotifyAuth, isTokenExpired, shouldRefreshToken, };
export type { TSpotify, TUserClient, TAuthenticatedUserClient, TPlayerClient, TPlaylistClient, TSearchClient, TLibraryClient, TChainableClient, TRequestOptions, TSpotifyClientConfig, TSpotifyUser, TSpotifyPagingObject, TSpotifyPlaylist, TSpotifyPlaylistTrack, TSpotifyTrack, TSpotifyAlbum, TSpotifyArtist, TSpotifyPlaybackState, TSpotifyPlayerDevice, TSpotifySearchResult, TSpotifyAudioFeatures, TSpotifyAudioAnalysis, TSpotifyTokenResponse, TSpotifyImage, TSpotifyExternalUrls, TSpotifyFollowers, TSpotifyContext, TSpotifyScope, TSpotifyAuthenticationError, TSpotifyTimeInterval, TSpotifySection, TSpotifySegment, TSpotifyRecentlyPlayedResponse, TSpotifyRecentlyPlayedItem, TSpotifyConfig, };
//# sourceMappingURL=index.d.ts.map