import { FFetchOptions } from '@fetchkit/ffetch';
import { Context, Effect, Layer } from 'effect';
import { DatabaseNameNormalizationMode } from './client/database-name.js';
import { FMODataErrorType } from './errors.js';
import { InternalLogger } from './logger.js';
export interface HttpClient {
    readonly request: <T>(url: string, options?: RequestInit & FFetchOptions & {
        normalizeDatabaseName?: boolean;
        databaseNameNormalizationMode?: DatabaseNameNormalizationMode;
        useEntityIds?: boolean;
        includeSpecialColumns?: boolean;
        includeODataAnnotations?: boolean;
        retryPolicy?: import('./types.js').RetryPolicy;
    }) => Effect.Effect<T, FMODataErrorType>;
}
export declare const HttpClient: Context.Tag<HttpClient, HttpClient>;
export interface ODataConfig {
    readonly baseUrl: string;
    readonly databaseName: string;
    readonly normalizeDatabaseName: boolean;
    readonly useEntityIds: boolean;
    readonly includeSpecialColumns: boolean;
}
export declare const ODataConfig: Context.Tag<ODataConfig, ODataConfig>;
export interface ODataLogger {
    readonly logger: InternalLogger;
}
export declare const ODataLogger: Context.Tag<ODataLogger, ODataLogger>;
export type FMODataLayer = Layer.Layer<HttpClient | ODataConfig | ODataLogger>;
/**
 * Extracts ODataConfig and ODataLogger values from a Layer synchronously.
 * Used by builders to access config in non-Effect methods (getRequestConfig, toRequest, etc.)
 */
export declare function extractConfigFromLayer(layer: FMODataLayer): {
    config: ODataConfig;
    logger: InternalLogger;
};
/**
 * Creates a database-scoped Layer by overriding ODataConfig with database-specific values.
 * The HttpClient and ODataLogger services are preserved from the base layer.
 */
export declare function createDatabaseLayer(baseLayer: FMODataLayer, overrides: {
    databaseName: string;
    normalizeDatabaseName: boolean;
    useEntityIds: boolean;
    includeSpecialColumns: boolean;
}): FMODataLayer;
