import { NumberRange, PropertyData, PropertyParser, PropertyParserStrictDataTypes, StringLength } from '../types';
import { OpenApiSchema } from '../openapi';
export interface BaseFieldOptions<T> extends PropertyData<T> {
    /**
     * Manual overrides or additional metadata for OpenAPI generation.
     * Properties like 'type', 'format', or constraints (like 'minLength')
     * provided in this object will take precedence over auto-generated ones.
     */
    readonly openApi?: OpenApiSchema;
}
export type StringFieldOptions = BaseFieldOptions<string> & StringLength;
export type NumberFieldOptions = BaseFieldOptions<number> & PropertyParserStrictDataTypes & NumberRange;
export type BooleanFieldOptions = BaseFieldOptions<boolean> & PropertyParserStrictDataTypes;
export type EnumFieldOptions<T extends string | number> = BaseFieldOptions<T>;
export type DateFieldOptions = BaseFieldOptions<Date>;
export type RegexFieldOptions = BaseFieldOptions<string>;
export interface ArrayFieldOptions<T> extends BaseFieldOptions<T[]> {
    readonly minLength?: number;
    readonly maxLength?: number;
    readonly strictDataTypes?: boolean;
    /** Per-item constraints when itemType === 'string' */
    readonly stringsLength?: StringLength;
    /** Per-item constraints when itemType === 'number' */
    readonly numbersRange?: NumberRange;
}
export interface ArrayDtoFieldOptions<T> extends BaseFieldOptions<T[]> {
    readonly minLength?: number;
    readonly maxLength?: number;
}
export type DtoFieldOptions<T> = BaseFieldOptions<T>;
export interface CustomFieldOptions<T> extends BaseFieldOptions<T> {
    /** The parser instance to use for this field. */
    readonly parser: PropertyParser<T>;
}
