import { type Middleware, type SpecialNextParam } from '../middlewares/shared.js';
import { MiddlewareComposite } from '../middlewares/composite-sync.js';
import { MiddlewareRoute, type Routable, type RouteBuilder, type RouteBuilderArguments } from './route.js';
import type { UriTemplate } from '../uri-template/index.js';
export interface RouterOptions {
    caseSensitive?: boolean;
    mergeParams?: boolean;
    strict?: boolean;
    length?: number;
    separator?: string;
    name?: string;
}
export type Routes<T extends [Routable, ...unknown[]], TReturnType, TSpecialNextParam extends SpecialNextParam = SpecialNextParam> = {
    [key: string]: ((...args: T) => TReturnType) | Routes<T, TReturnType, TSpecialNextParam>;
};
export type ParamCallback<T> = (req: any, paramVal: unknown, name: string, ...rest: any[]) => Promise<T>;
/**
 * Use routes.
 * @param {Routes<T, TReturnType>} routes - The routes.
 * @param {MiddlewareComposite<T> & { route: RouteBuilder<T> }} [parent] - The parent middleware composite.
 * @returns {MiddlewareComposite<T>} The middleware composite.
 */
export declare function useRoutes<T extends [Routable, ...unknown[]], TReturnType, TSpecialNextParam extends SpecialNextParam = SpecialNextParam>(routes: Routes<T, TReturnType, TSpecialNextParam>, parent?: MiddlewareComposite<T> & {
    route: RouteBuilder<T, TSpecialNextParam>;
}): MiddlewareComposite<T>;
/**
 * Router class.
 * @template T
 * @extends {MiddlewareComposite<T>}
 * @implements {Middleware<T>}
 */
export declare class Router<T extends [{
    path: string;
    params?: Record<string, unknown>;
}, ...unknown[]], TSpecialNextParam extends SpecialNextParam = SpecialNextParam> extends MiddlewareComposite<T, TSpecialNextParam> implements Middleware<T, TSpecialNextParam> {
    /**
     * Creates an instance of Router.
     * @param {RouterOptions} [options] - The router options.
     */
    constructor(options?: RouterOptions);
    /**
     * Creates a new route.
     * @param {...RouteBuilderArguments} args - The route builder arguments.
     * @returns {MiddlewareRoute<T>} The middleware route.
     */
    route(...args: RouteBuilderArguments): MiddlewareRoute<T, TSpecialNextParam>;
    /**
     * Uses routes.
     * @param {Routes<T, unknown>} routes - The routes.
     * @returns {this} The router instance.
     */
    useRoutes(routes: Routes<T, unknown, TSpecialNextParam>): this;
    /**
     * Uses middleware.
     * @param {string | UriTemplate} route - The route.
     * @param {...Middleware<T>} middlewares - The middlewares.
     * @returns {this} The router instance.
     */
    useMiddleware(route: string | UriTemplate, ...middlewares: Middleware<T, TSpecialNextParam>[]): this;
    useMiddleware(...middlewares: Middleware<T, TSpecialNextParam>[]): this;
    /**
     * Uses middleware.
     * @param {string | UriTemplate} route - The route.
     * @param {...((...args: T) => unknown)} middlewares - The middlewares.
     * @returns {this} The router instance.
     */
    use(route: string | UriTemplate, ...middlewares: ((...args: T) => unknown)[]): this;
    use(...middlewares: ((...args: T) => unknown)[]): this;
}
