import { EventEmitter } from 'events';
import { Request, RequestHandler } from 'express';
export interface ABTestConfig {
    name: string;
    enabled?: boolean;
    variants: VariantConfig[];
    defaultVariant?: string;
    cookieName?: string;
    headerName?: string;
    userIdExtractor?: (req: Request) => string | undefined;
    stickySession?: boolean;
    metrics?: MetricsConfig;
    segmentation?: SegmentationRule[];
    startDate?: Date;
    endDate?: Date;
}
export interface VariantConfig {
    name: string;
    weight: number;
    handler?: RequestHandler;
    metadata?: Record<string, any>;
}
export interface MetricsConfig {
    trackPageViews?: boolean;
    trackConversions?: boolean;
    trackCustomEvents?: boolean;
    customMetrics?: string[];
}
export interface SegmentationRule {
    name: string;
    condition: (req: Request) => boolean;
    variants: Array<{
        name: string;
        weight: number;
    }>;
}
export interface ABTestMetrics {
    testName: string;
    variant: string;
    pageViews: number;
    conversions: number;
    conversionRate: number;
    customEvents: Record<string, number>;
    avgResponseTime: number;
    errors: number;
    startTime: Date;
    lastUpdate: Date;
}
export interface ABTestResults {
    testName: string;
    status: 'active' | 'completed' | 'paused';
    startDate: Date;
    endDate?: Date;
    variants: Record<string, ABTestMetrics>;
    winner?: string;
    confidence?: number;
    sampleSize: number;
}
export declare class ABTestingMiddleware extends EventEmitter {
    private tests;
    private assignments;
    private metrics;
    private config;
    constructor(config?: {
        defaultCookieName?: string;
        defaultHeaderName?: string;
        persistAssignments?: boolean;
        metricsInterval?: number;
    });
    createTest(config: ABTestConfig): void;
    removeTest(testName: string): void;
    toggleTest(testName: string, enabled: boolean): void;
    private getVariantAssignment;
    private selectVariantByWeight;
    private storeAssignment;
    trackEvent(testName: string, variant: string, eventType: 'pageView' | 'conversion' | 'error' | 'custom', eventName?: string, value?: number): void;
    middleware(testName: string): RequestHandler;
    getTestResults(testName: string): ABTestResults | null;
    getAllResults(): ABTestResults[];
    calculateRequiredSampleSize(testName: string, baselineConversionRate: number, minimumDetectableEffect: number, power?: number, significance?: number): number;
    destroy(): void;
}
export declare function createABTestingMiddleware(config?: {
    defaultCookieName?: string;
    defaultHeaderName?: string;
    persistAssignments?: boolean;
    metricsInterval?: number;
}): ABTestingMiddleware;
//# sourceMappingURL=ab-testing-middleware.d.ts.map