import { TapoApiRequest, TapoApiResponse } from '../types';
export interface RequestOptions {
    timeout?: number;
    retries?: number;
    priority?: RequestPriority;
}
export declare enum RequestPriority {
    LOW = 0,
    NORMAL = 1,
    HIGH = 2,
    CRITICAL = 3
}
interface QueuedRequest {
    id: string;
    request: TapoApiRequest;
    options: RequestOptions;
    priority: RequestPriority;
    timestamp: number;
    resolve: (response: TapoApiResponse) => void;
    reject: (error: Error) => void;
}
/**
 * Manages request queuing, rate limiting, and request lifecycle
 * Single responsibility: Request queue management and rate limiting
 */
export declare class RequestManager {
    private readonly minRequestInterval;
    private requestQueue;
    private isProcessing;
    private lastRequestTime;
    private requestCounter;
    private requestExecutor?;
    constructor(minRequestInterval?: number);
    /**
     * Queue a request for execution
     */
    queueRequest(request: TapoApiRequest, options?: RequestOptions): Promise<TapoApiResponse>;
    /**
     * Add request to queue with priority ordering
     */
    private addToQueue;
    /**
     * Process the request queue
     */
    private processQueue;
    /**
     * Set the request executor function
     */
    setRequestExecutor(executor: (request: TapoApiRequest) => Promise<TapoApiResponse>): void;
    /**
     * Execute a single request using the configured executor
     */
    protected executeRequest(queuedRequest: QueuedRequest): Promise<TapoApiResponse>;
    /**
     * Enforce rate limiting between requests
     */
    private enforceRateLimit;
    /**
     * Determine if a request should be retried
     */
    private shouldRetry;
    /**
     * Generate unique request ID
     */
    private generateRequestId;
    /**
     * Get current queue status
     */
    getQueueStatus(): {
        queueLength: number;
        isProcessing: boolean;
        lastRequestTime: number;
    };
    /**
     * Clear the request queue (useful for cleanup)
     */
    clearQueue(): void;
    /**
     * Cancel a specific request by ID
     */
    cancelRequest(requestId: string): boolean;
    /**
     * Get requests by priority
     */
    getRequestsByPriority(priority: RequestPriority): QueuedRequest[];
    /**
     * Update minimum request interval (useful for different protocols)
     */
    updateMinRequestInterval(interval: number): void;
}
export {};
