import { AxiosRequestConfig } from 'axios';
import { IWordPressCredentials } from '../interfaces/WordPressInterfaces';
import { LogLevel, ILoggerOptions } from './Logger';
/**
 * Interface para informações de rota descoberta
 */
export interface IRouteInfo {
    endpoint: string;
    methods: string[];
    namespace: string;
    version?: string;
}
/**
 * Interface para resultado da descoberta de rotas
 */
export interface IRouteDiscoveryResult {
    success: boolean;
    routes: IRouteInfo[];
    apiVersion: string;
    availableVersions: string[];
    error?: string;
}
/**
 * Interface para resultado da detecção de versão da API
 */
export interface IApiVersionDetectionResult {
    detectedVersion: string;
    availableVersions: string[];
    isSupported: boolean;
    recommendedVersion?: string;
}
/**
 * Opções de configuração para o cliente WordPress
 */
export interface IWordPressClientOptions {
    /**
     * Timeout para requisições em ms (padrão: 30000)
     */
    timeout?: number;
    /**
     * Número máximo de tentativas para requisições que falham (padrão: 3)
     */
    maxRetries?: number;
    /**
     * Tempo de espera entre tentativas em ms (padrão: 1000)
     */
    retryDelay?: number;
    /**
     * Habilitar logs detalhados (padrão: false)
     */
    debug?: boolean;
    /**
     * Versão da API REST do WordPress (padrão: 'v2')
     */
    apiVersion?: string;
    /**
     * Opções de logging
     */
    logOptions?: ILoggerOptions;
}
/**
 * Cliente HTTP para a API REST do WordPress
 * Encapsula o Axios e fornece métodos para interagir com a API
 */
export declare class WordPressClient {
    private client;
    private baseUrl;
    private readonly options;
    private credentials;
    private readonly logger;
    private readonly authManager;
    private discoveredRoutes;
    private routeDiscoveryCache;
    private apiVersionDetected;
    /**
     * Construtor do cliente WordPress
     * @param credentials Credenciais para acesso à API
     * @param options Opções de configuração
     */
    constructor(credentials: IWordPressCredentials, options?: IWordPressClientOptions);
    /**
     * Cria a instância do Axios com as configurações necessárias
     * @returns Instância configurada do Axios
     */
    private createAxiosInstance;
    /**
     * Configura interceptadores para request/response
     */
    private setupInterceptors;
    /**
     * Executa uma requisição com suporte a retry
     * @param requestFn Função que executa a requisição
     * @returns Resultado da requisição
     */
    private executeWithRetry;
    /**
     * Calcula o tempo de espera para o backoff exponencial
     * @param attempt Número da tentativa atual (começando em 1)
     * @returns Tempo de espera em ms
     */
    private calculateBackoff;
    /**
     * Descobre as rotas disponíveis na API REST do WordPress
     * @param forceRefresh Força uma nova descoberta ignorando o cache
     * @returns Resultado da descoberta de rotas
     */
    discoverRoutes(forceRefresh?: boolean): Promise<IRouteDiscoveryResult>;
    /**
     * Detecta automaticamente a versão da API mais adequada
     * @returns Resultado da detecção de versão
     */
    detectApiVersion(): Promise<IApiVersionDetectionResult>;
    /**
     * Valida se um endpoint específico está disponível
     * @param endpoint Endpoint a ser validado (sem barra inicial)
     * @param method Método HTTP (opcional, padrão: GET)
     * @returns True se o endpoint estiver disponível
     */
    validateEndpoint(endpoint: string, method?: string): Promise<boolean>;
    /**
     * Realiza uma requisição GET
     * @param endpoint Endpoint da API (sem barra inicial)
     * @param params Parâmetros da query string
     * @returns Dados da resposta
     */
    get<T = any>(endpoint: string, params?: Record<string, any>): Promise<T>;
    /**
     * Realiza uma requisição POST
     * @param endpoint Endpoint da API (sem barra inicial)
     * @param data Dados a serem enviados
     * @returns Dados da resposta
     */
    post<T = any>(endpoint: string, data: Record<string, any>): Promise<T>;
    /**
     * Realiza uma requisição POST com opções adicionais
     * @param endpoint Endpoint da API (sem barra inicial)
     * @param data Dados a serem enviados
     * @param options Opções adicionais da requisição
     * @returns Dados da resposta
     */
    postWithOptions<T = any>(endpoint: string, data: any, options?: AxiosRequestConfig): Promise<T>;
    /**
     * Realiza uma requisição PUT
     * @param endpoint Endpoint da API (sem barra inicial)
     * @param data Dados a serem enviados
     * @returns Dados da resposta
     */
    put<T = any>(endpoint: string, data: Record<string, any>): Promise<T>;
    /**
     * Realiza uma requisição DELETE
     * @param endpoint Endpoint da API (sem barra inicial)
     * @returns Dados da resposta
     */
    delete<T = any>(endpoint: string): Promise<T>;
    /**
     * Faz upload de um arquivo de mídia para o WordPress
     * @param fileData Buffer com os dados do arquivo
     * @param fileName Nome do arquivo
     * @param mimeType Tipo MIME do arquivo
     * @returns Informações do arquivo enviado
     */
    uploadMedia<T = any>(fileData: Buffer, fileName: string, mimeType: string): Promise<T>;
    /**
     * Formata o endpoint removendo barras iniciais e duplicadas
     * @param endpoint Endpoint a ser formatado
     * @returns Endpoint formatado
     */
    private formatEndpoint;
    /**
     * Obter URL base da API
     * @returns URL base
     */
    getBaseUrl(): string;
    /**
     * Obter versão da API
     * @returns Versão da API
     */
    getApiVersion(): string;
    /**
     * Definir nível de log
     * @param level Nível de log
     */
    setLogLevel(level: LogLevel): void;
    /**
     * Atualiza as credenciais do cliente
     * @param credentials Novas credenciais
     */
    updateCredentials(credentials: IWordPressCredentials): void;
    /**
     * Define um token de nonce para requisições que necessitam
     * @param nonce Token de nonce
     */
    setNonce(nonce: string): void;
    /**
     * Obtém um cabeçalho da última resposta recebida
     * @param header Nome do cabeçalho
     * @returns Valor do cabeçalho ou null se não existir
     */
    getLastResponseHeader(header: string): string | null;
}
