import { Router, Request, Response } from 'express';
import { DataResult, PathSpec } from './HistoryAPI-types';
import { ZonedDateTime } from '@js-joda/core';
import { Context } from '@signalk/server-api';
import { ParamsDictionary } from 'express-serve-static-core';
import { ParsedQs } from 'qs';
import { SQLiteBufferInterface } from './types';
import { AggregationTier } from './utils/hive-path-builder';
import { AutoDiscoveryService } from './services/auto-discovery';
import { SpatialFilter } from './utils/spatial-queries';
import { PathRetentionRule } from './utils/retention-rules';
export declare function registerHistoryApiRoute(router: Pick<Router, 'get'>, selfId: string, dataDir: string, debug: (k: string) => void, app: any, sqliteBuffer?: SQLiteBufferInterface, autoDiscoveryService?: AutoDiscoveryService, s3Config?: S3QueryConfig, pathRetentionOverrides?: PathRetentionRule[]): void;
type QuerySource = 'local' | 's3' | 'hybrid' | 'auto';
export interface S3QueryConfig {
    enabled: boolean;
    bucket: string;
    keyPrefix: string;
    region: string;
}
export declare class HistoryAPI {
    private selfId;
    private dataDir;
    private sqliteBuffer?;
    private hivePathBuilder;
    private autoDiscoveryService?;
    private s3Config?;
    private retentionRules;
    constructor(selfId: string, dataDir: string, sqliteBuffer?: SQLiteBufferInterface, autoDiscoveryService?: AutoDiscoveryService, s3Config?: S3QueryConfig, pathRetentionOverrides?: PathRetentionRule[]);
    /**
     * Set S3 configuration for federated queries
     */
    setS3Config(config: S3QueryConfig | undefined): void;
    /**
     * Set the auto-discovery service
     */
    setAutoDiscoveryService(service: AutoDiscoveryService | undefined): void;
    /**
     * Set the SQLite buffer for federated queries
     */
    setSqliteBuffer(buffer: SQLiteBufferInterface | undefined): void;
    /**
     * Auto-select the optimal tier based on requested resolution
     * Returns undefined to use raw/flat data, or a tier name for aggregated data
     *
     * Logic:
     * - resolution >= 1 hour (3600000ms) → use 1h tier
     * - resolution >= 1 minute (60000ms) → use 60s tier
     * - resolution >= 5 seconds (5000ms) → use 5s tier
     * - resolution < 5 seconds → use raw data (no tier)
     *
     * Falls back through tiers if preferred tier doesn't exist
     */
    private selectOptimalTier;
    /**
     * Get timestamps where vessel position was within the spatial filter
     * Used to correlate non-position paths with spatial filtering
     */
    private getSpatialTimestamps;
    getValues(context: Context, from: ZonedDateTime, to: ZonedDateTime, spatialFilter: SpatialFilter | null, app: any, debug: (k: string) => void, req: Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>, res: Response<any, Record<string, any>>): Promise<void>;
    getNumericValues(context: Context, from: ZonedDateTime, to: ZonedDateTime, timeResolutionMillis: number, pathSpecs: PathSpec[], debug: (k: string) => void, tier?: AggregationTier, spatialFilter?: SpatialFilter | null, querySource?: QuerySource, positionPath?: string, app?: any): Promise<DataResult>;
    private mergePathData;
    private addMovingAverages;
    private buildValuesWithMovingAverages;
}
export {};
//# sourceMappingURL=HistoryAPI.d.ts.map