/**
 * Dynamic Configuration Client with Real-time Updates
 */
import { WebSocketConfig } from './websocket-client';
import { UserContext } from './types';
export interface DynamicConfigClientConfig {
    /** API key for authentication */
    apiKey: string;
    /** JWT token for WebSocket authentication */
    jwtToken?: string;
    /** Base URL for the API */
    baseUrl?: string;
    /** Project ID for configuration subscriptions */
    projectId: string;
    /** Enable real-time updates via WebSocket (default: true) */
    enableRealtime?: boolean;
    /** Polling interval for fallback mode in ms (default: 30000) */
    pollingInterval?: number;
    /** Cache configuration */
    cache?: {
        ttl?: number;
        maxSize?: number;
        enabled?: boolean;
    };
    /** WebSocket configuration */
    websocket?: Partial<WebSocketConfig>;
    /** Enable debug logging (default: false) */
    debug?: boolean;
}
export interface DynamicConfigResult<T = any> {
    /** Configuration key */
    key: string;
    /** Configuration value */
    value: T;
    /** Evaluation reason */
    reason: string;
    /** Rule ID that matched (if any) */
    ruleId?: string;
    /** ETag for cache validation */
    etag?: string;
    /** Configuration version */
    version?: number;
    /** When the config was last updated */
    updatedAt?: Date;
    /** Whether the result came from cache */
    cacheHit: boolean;
    /** Whether the result came from real-time update */
    realTimeUpdate: boolean;
    /** When the config was evaluated/retrieved */
    retrievedAt: Date;
    /** Error if evaluation failed */
    error?: Error;
}
export interface DynamicConfigEvaluationRequest {
    config_key: string;
    context: UserContext;
}
export interface DynamicConfigEvaluationResponse {
    config_key: string;
    value: any;
    reason: string;
    rule_id?: string;
    etag?: string;
    version?: number;
    updated_at?: string;
}
export type ConfigChangeCallback<T = any> = (result: DynamicConfigResult<T>) => void;
export declare class DynamicConfigClient {
    private config;
    private wsClient;
    private cache;
    private logger;
    private metrics;
    private configValues;
    private configCallbacks;
    private pollingTimer;
    private isRealTimeMode;
    private fallbackMode;
    constructor(config: DynamicConfigClientConfig);
    /**
     * Get a dynamic configuration value
     */
    getConfig<T = any>(configKey: string, defaultValue: T, userContext: UserContext): Promise<T>;
    /**
     * Get a boolean dynamic configuration
     */
    getConfigBool(configKey: string, defaultValue: boolean, userContext: UserContext): Promise<boolean>;
    /**
     * Get a string dynamic configuration
     */
    getConfigString(configKey: string, defaultValue: string, userContext: UserContext): Promise<string>;
    /**
     * Get a number dynamic configuration
     */
    getConfigNumber(configKey: string, defaultValue: number, userContext: UserContext): Promise<number>;
    /**
     * Get a JSON dynamic configuration
     */
    getConfigJSON<T = any>(configKey: string, defaultValue: T, userContext: UserContext): Promise<T>;
    /**
     * Evaluate a dynamic configuration with full details
     */
    evaluateConfig<T = any>(configKey: string, defaultValue: T, userContext: UserContext): Promise<DynamicConfigResult<T>>;
    /**
     * Subscribe to real-time updates for a specific configuration
     */
    onConfigChange<T = any>(configKey: string, callback: ConfigChangeCallback<T>): () => void;
    /**
     * Subscribe to all configuration changes in the project
     */
    onAnyConfigChange(callback: ConfigChangeCallback): () => void;
    /**
     * Refresh all cached configurations
     */
    refreshConfigs(userContext: UserContext): Promise<void>;
    /**
     * Get current connection status
     */
    getConnectionStatus(): {
        mode: 'realtime' | 'polling' | 'offline';
        connected: boolean;
        fallbackActive: boolean;
    };
    /**
     * Disconnect and cleanup
     */
    disconnect(): void;
    /**
     * Initialize WebSocket client and set up real-time updates
     */
    private initializeWebSocket;
    /**
     * Handle real-time configuration updates from WebSocket
     */
    private handleRealtimeConfigUpdate;
    /**
     * Notify configuration change callbacks
     */
    private notifyConfigCallbacks;
    /**
     * Start polling mode for fallback
     */
    private startPolling;
    /**
     * Stop polling mode
     */
    private stopPolling;
    /**
     * Poll for configuration changes (fallback mode)
     */
    private pollConfigurations;
    /**
     * Evaluate configuration via HTTP API with ETag support
     */
    private evaluateConfigViaAPI;
    /**
     * Generate cache key for configuration
     */
    private generateCacheKey;
    /**
     * Generate a simple hash of user context for caching
     */
    private hashUserContext;
    /**
     * Normalize configuration with defaults
     */
    private normalizeConfig;
}
//# sourceMappingURL=dynamic-config-client.d.ts.map