import { DateTime } from 'luxon';
import { ParseTrace } from '../utils/debug-trace';
import { ParseComponent } from '../resolver/resolution-engine';
/**
 * Configuration options for date parsing
 */
export interface TimeOfDayPreferences {
    morning: {
        start: number;
        end: number;
        early: {
            start: number;
            end: number;
        };
        mid: {
            start: number;
            end: number;
        };
        late: {
            start: number;
            end: number;
        };
    };
    afternoon: {
        start: number;
        end: number;
        early: {
            start: number;
            end: number;
        };
        mid: {
            start: number;
            end: number;
        };
        late: {
            start: number;
            end: number;
        };
    };
    evening: {
        start: number;
        end: number;
        early: {
            start: number;
            end: number;
        };
        mid: {
            start: number;
            end: number;
        };
        late: {
            start: number;
            end: number;
        };
    };
    night: {
        start: number;
        end: number;
        early: {
            start: number;
            end: number;
        };
        mid: {
            start: number;
            end: number;
        };
        late: {
            start: number;
            end: number;
        };
    };
}
export interface DateParsePreferences {
    referenceDate?: DateTime;
    timeZone?: string;
    useLocalTimezone?: boolean;
    weekStartsOn?: number;
    timeOfDay?: TimeOfDayPreferences;
    parser?: {
        parse: (input: string, prefs: DateParsePreferences) => ParseResult | null;
    };
    debug?: boolean;
}
/**
 * Result of a successful date/time parse
 */
export interface ParseResult {
    type: 'single' | 'range';
    start: DateTime;
    end?: DateTime;
    confidence: number;
    text: string;
    debugTrace?: ParseTrace;
}
export interface ParserState {
    preferences: DateParsePreferences;
    rules: RuleModule[];
}
export interface RuleModule {
    name: string;
    patterns: Pattern[];
    interpret?: (intermediate: IntermediateParse, prefs: DateParsePreferences) => ParseResult | null;
}
export interface Pattern {
    regex: RegExp;
    parse: (matches: RegExpExecArray, preferences: DateParsePreferences) => ParseComponent | null;
}
export interface SingleDateResult {
    type: 'single';
    start: DateTime;
    end?: DateTime;
    text: string;
    confidence: number;
}
export interface DateRangeResult {
    type: 'range';
    start: DateTime;
    end: DateTime;
    text: string;
    confidence: number;
}
/**
 * Intermediate parse result before final interpretation
 */
export interface IntermediateParse {
    type: 'single' | 'range' | 'absolute' | 'relative' | 'time' | 'ordinal' | 'datetime';
    start?: DateTime;
    end?: DateTime;
    text?: string;
    confidence?: number;
    pattern?: string;
    captures?: {
        [key: string]: string;
    };
    tokens?: string[];
}
export type DateType = 'absolute' | 'relative' | 'ordinal';
export type RangeType = 'time' | 'timeOfDay' | 'partialMonth' | 'ordinalWeek' | 'fuzzy' | 'relativeWeek';
export interface ParseMetadata {
    originalText: string;
    dateType?: DateType;
    rangeType?: RangeType;
    modifiers?: string[];
}
//# sourceMappingURL=types.d.ts.map