import { Pathfinder, RouteParams } from '@sigiljs/pathfinder';
import { ClientRequest } from '../index';
import { default as SigilResponsesList } from '../sigil/misc/sigil-responses-list';
import { default as Sigil } from '../sigil/sigil';
import { Internal } from '../types';
import { MergePayloads, ModifierConstructor } from './modifier/modifier';
import { RouteOptions } from './route';
import { default as RouteCore } from './route-core';
type Constructor = (readonly ModifierConstructor<any, any>[]) | undefined;
type THandler<Path extends string, Body extends Record<string, any> | undefined = undefined, Headers extends Record<string, string | undefined> = Record<string, string | undefined>, Query extends Record<string, string | undefined> = Record<string, string | undefined>, M extends Constructor | undefined = undefined> = (request: X<Internal.Requests.ClientRequest<RouteParams<Path>, Body, Headers, Query>, M>, responses: SigilResponsesList, app: Sigil | null) => Internal.Requests.HandlerResponse;
type X<T extends ClientRequest<any>, M extends Constructor> = T & (M extends readonly ModifierConstructor<any, any>[] ? MergePayloads<M> : {});
/**
 * Extends RouteCore to provide methods for registering HTTP routes
 * with optional validation schemas. Automatically derives request types
 * based on configured schemas.
 *
 * @template Modifier tuple of modifier constructors applied to this route.
 * @template BodySchema shape of the request body schema, if provided.
 * @template HeadersSchema shape of the request headers schema, if provided.
 * @template QuerySchema shape of the request query schema, if provided.
 */
export default class RouteRequests<Modifier extends Constructor, BodySchema extends Record<string, any> | undefined = undefined, HeadersSchema extends Record<string, string | undefined> = Record<string, string | undefined>, QuerySchema extends Record<string, string | undefined> = Record<string, string | undefined>> extends RouteCore<Modifier> {
    /**
     * @param modifiers array of modifier constructors to apply.
     * @param pathfinder the underlying pathfinder router instance.
     * @param $options optional router configuration options.
     */
    constructor(modifiers: Modifier, pathfinder: Pathfinder, $options?: RouteOptions<Modifier>);
    /**
     * Registers a GET route.
     * Not available if a body schema was previously applied.
     *
     * @param path URL path for the route.
     * @param handler request handler function.
     * @returns chainable methods for adding metadata (meta, description).
     */
    get<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): {
        /**
         * Adds metadata to the registered route.
         * @param payload partial metadata object to merge.
         */
        meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void;
        /**
         * Shortcut to set the route description metadata.
         * @param payload description text.
         */
        description(payload: string): void;
    };
    /** Registers a POST route. */
    post<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): {
        /**
         * Adds metadata to the registered route.
         * @param payload partial metadata object to merge.
         */
        meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void;
        /**
         * Shortcut to set the route description metadata.
         * @param payload description text.
         */
        description(payload: string): void;
    };
    /** Registers a PUT route. */
    put<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): {
        /**
         * Adds metadata to the registered route.
         * @param payload partial metadata object to merge.
         */
        meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void;
        /**
         * Shortcut to set the route description metadata.
         * @param payload description text.
         */
        description(payload: string): void;
    };
    /** Registers a PATCH route. */
    patch<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): {
        /**
         * Adds metadata to the registered route.
         * @param payload partial metadata object to merge.
         */
        meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void;
        /**
         * Shortcut to set the route description metadata.
         * @param payload description text.
         */
        description(payload: string): void;
    };
    /** Registers a DELETE route. */
    delete<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): {
        /**
         * Adds metadata to the registered route.
         * @param payload partial metadata object to merge.
         */
        meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void;
        /**
         * Shortcut to set the route description metadata.
         * @param payload description text.
         */
        description(payload: string): void;
    };
    /** Registers an OPTIONS route. */
    options<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): {
        /**
         * Adds metadata to the registered route.
         * @param payload partial metadata object to merge.
         */
        meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void;
        /**
         * Shortcut to set the route description metadata.
         * @param payload description text.
         */
        description(payload: string): void;
    };
    /** Registers a TRACE route. */
    trace<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): {
        /**
         * Adds metadata to the registered route.
         * @param payload partial metadata object to merge.
         */
        meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void;
        /**
         * Shortcut to set the route description metadata.
         * @param payload description text.
         */
        description(payload: string): void;
    };
    /** Registers a CONNECT route. */
    connect<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): {
        /**
         * Adds metadata to the registered route.
         * @param payload partial metadata object to merge.
         */
        meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void;
        /**
         * Shortcut to set the route description metadata.
         * @param payload description text.
         */
        description(payload: string): void;
    };
    /** Registers a HEAD route. */
    head<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): {
        /**
         * Adds metadata to the registered route.
         * @param payload partial metadata object to merge.
         */
        meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void;
        /**
         * Shortcut to set the route description metadata.
         * @param payload description text.
         */
        description(payload: string): void;
    };
    /**
     * Internal method to register a route with pathfinder.
     * Validates incoming requests against schemas if provided.
     *
     * @param method HTTP method for the route.
     * @param path URL path for the route.
     * @param handler request handler function.
     * @returns chainable methods for adding metadata (meta, description).
     * @private
     */
    private $request;
}
export {};
