import { type ReAuthEngine, type AuthOutput } from "@re-auth/reauth";
/**
 * Context extraction rule for specific plugin/step combinations
 */
export interface ContextExtractionRule {
    pluginName: string;
    stepName?: string;
    /**
     * Cookie names to extract from request and add to step inputs
     */
    extractCookies?: string[];
    /**
     * Header names to extract from request and add to step inputs
     * Format: { headerName: inputName } or just headerName (uses same name)
     */
    extractHeaders?: string[] | Record<string, string>;
    /**
     * Cookie names to set in response (will be populated from step outputs)
     */
    setCookies?: string[];
    /**
     * Header names to set in response (will be populated from step outputs)
     */
    setHeaders?: string[] | Record<string, string>;
    /**
     * Transform function for input values
     */
    transformInput?: (key: string, value: any, request: any) => any;
    /**
     * Transform function for output values
     */
    transformOutput?: (key: string, value: any, result: AuthOutput, request: any) => any;
}
/**
 * Auto-generated route information
 */
export interface AutoGeneratedRoute {
    pluginName: string;
    stepName: string;
    method: string;
    path: string;
    requiresAuth: boolean;
    description: string;
    inputs: string[];
}
/**
 * Auto-introspection configuration
 */
export interface AutoIntrospectionConfig {
    /**
     * Whether to enable auto-introspection (default: true)
     */
    enabled?: boolean;
    /**
     * Plugins to include (if not specified, all plugins are included)
     */
    includePlugins?: string[];
    /**
     * Plugins to exclude
     */
    excludePlugins?: string[];
    /**
     * Steps to exclude (format: 'pluginName.stepName')
     */
    excludeSteps?: string[];
    /**
     * Custom path generator for auto-generated routes
     */
    pathGenerator?: (pluginName: string, stepName: string, basePath: string) => string;
    /**
     * Callback when routes are auto-generated
     */
    onRoutesGenerated?: (routes: AutoGeneratedRoute[]) => void;
}
/**
 * Base HTTP configuration for all adapters
 */
export interface BaseHttpConfig {
    basePath?: string;
    cookieName?: string;
    cookieOptions?: {
        httpOnly?: boolean;
        secure?: boolean;
        sameSite?: "strict" | "lax" | "none" | boolean;
        maxAge?: number;
        domain?: string;
        path?: string;
    };
    /**
     * Auto-introspection configuration
     */
    autoIntrospection?: AutoIntrospectionConfig;
    /**
     * Context extraction rules for plugins and steps
     * Defines what cookies/headers to extract from requests and set in responses
     */
    contextRules?: ContextExtractionRule[];
    /**
     * Custom route overrides
     * Allows overriding specific plugin step routes
     */
    routeOverrides?: RouteOverride[];
    /**
     * Custom routes for external plugins or additional functionality
     */
    customRoutes?: CustomRoute[];
    /**
     * Global middleware to apply to all routes
     */
    globalMiddleware?: any[];
    /**
     * Custom error handler
     */
    errorHandler?: (error: Error, context: any) => any;
}
/**
 * Route override configuration
 */
export interface RouteOverride {
    pluginName: string;
    stepName: string;
    /**
     * Override the HTTP method
     */
    method?: string;
    /**
     * Override the route path
     */
    path?: string;
    /**
     * Override the route handler completely
     */
    handler?: any;
    /**
     * Add middleware before the default handler
     */
    middleware?: any[];
    /**
     * Custom input extraction logic
     */
    extractInputs?: (request: any, pluginName: string, stepName: string) => Promise<Record<string, any>>;
    /**
     * Custom response handling logic
     */
    handleResponse?: (request: any, response: any, result: AuthOutput, httpConfig: any) => any;
}
/**
 * Custom route configuration
 */
export interface CustomRoute {
    method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
    path: string;
    handler: any;
    middleware?: any[];
    /**
     * Whether this route requires authentication
     */
    requireAuth?: boolean;
}
/**
 * HTTP adapter context for handlers
 */
export interface HttpAdapterContext {
    engine: ReAuthEngine;
    config: Required<Omit<BaseHttpConfig, "errorHandler">> & {
        errorHandler?: (error: Error, context: any) => any;
    };
    extractToken: (request: any) => string | null;
    requireAuth: () => any;
    handleStepResponse: (request: any, response: any, result: AuthOutput, httpConfig: any) => any;
    errorResponse: (response: any, error: Error) => any;
    autoGeneratedRoutes: AutoGeneratedRoute[];
}
/**
 * HTTP adapter factory function type
 */
export type HttpAdapterFactory<T extends BaseHttpConfig, R = any> = (engine: ReAuthEngine, config: T) => R;
/**
 * Framework-specific adapter implementation
 */
export interface FrameworkAdapter<T extends BaseHttpConfig> {
    setupMiddleware(context: HttpAdapterContext): void;
    createRoute(method: string, path: string, handler: any, middleware?: any[]): void;
    extractInputs(request: any, pluginName: string, stepName: string): Promise<Record<string, any>>;
    handleStepResponse(request: any, response: any, result: AuthOutput, httpConfig: any): any;
    /**
     * Add configurable context inputs from cookies and headers based on context rules
     */
    addConfigurableContextInputs(request: any, inputs: Record<string, any>, pluginName: string, stepName: string, contextRules: ContextExtractionRule[]): void;
    /**
     * Handle configurable context outputs (set cookies and headers) based on context rules
     */
    handleConfigurableContextOutputs(request: any, response: any, result: AuthOutput, pluginName: string, stepName: string, contextRules: ContextExtractionRule[]): void;
    extractToken(request: any): string | null;
    requireAuth(): any;
    errorResponse(response: any, error: Error): any;
    getAdapter(): any;
}
/**
 * Introspect ReAuth engine and extract all available routes
 */
export declare function introspectReAuthEngine(engine: ReAuthEngine, config?: AutoIntrospectionConfig): AutoGeneratedRoute[];
/**
 * Creates a generic HTTP adapter for any framework
 */
export declare function createHttpAdapter<T extends BaseHttpConfig>(frameworkAdapter: FrameworkAdapter<T>): HttpAdapterFactory<T>;
/**
 * Find applicable context extraction rules for a plugin/step combination
 */
export declare function findContextRules(pluginName: string, stepName: string, contextRules: ContextExtractionRule[]): ContextExtractionRule[];
/**
 * Utility function to create route override
 */
export declare function createRouteOverride(pluginName: string, stepName: string, override: Partial<Omit<RouteOverride, "pluginName" | "stepName">>): RouteOverride;
/**
 * Utility function to create custom route
 */
export declare function createCustomRoute(method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH", path: string, handler: any, options?: {
    middleware?: any[];
    requireAuth?: boolean;
}): CustomRoute;
/**
 * Utility function to create auto-introspection config
 */
export declare function createAutoIntrospectionConfig(options?: Partial<AutoIntrospectionConfig>): AutoIntrospectionConfig;
/**
 * Utility function to create context extraction rule
 */
export declare function createContextRule(pluginName: string, options?: Partial<Omit<ContextExtractionRule, "pluginName">>): ContextExtractionRule;
/**
 * Predefined context rules for common OAuth scenarios
 */
export declare const OAuth2ContextRules: {
    /**
     * OAuth 2.0 with PKCE context rule for extracting state and code verifier
     */
    pkce: (pluginName: string) => ContextExtractionRule;
    /**
     * OAuth 2.0 regular flow context rule for extracting state
     */
    regular: (pluginName: string) => ContextExtractionRule;
    /**
     * OAuth callback context rule for all OAuth steps
     */
    callback: (pluginName: string) => ContextExtractionRule;
    /**
     * OAuth start context rule for setting state and code verifier
     */
    start: (pluginName: string) => ContextExtractionRule;
};
//# sourceMappingURL=http-adapter-factory.d.ts.map