import { Express, RequestHandler, ErrorRequestHandler } from 'express';

type ExpressMethod = "get" | "post" | "delete" | "put" | "patch" | "all";
type PartialExpressMethodRecord<T> = Partial<Record<ExpressMethod, T>>;
type FileBasedRoutingOptions = {
    app: Express;
    target?: string;
};
type RouteConfig = Partial<{
    pattern: RegExp | string | PartialExpressMethodRecord<RegExp | string>;
}>;
type DirRouteConfig = Partial<{
    pattern: RegExp | string;
}>;
type FilesHandlerConfig = {
    route: string;
    name: string;
    basename: string;
    target: string;
    isParam: boolean;
};
type DirsHandlerConfig = FilesHandlerConfig & {
    parent: string;
};
type MapRoutesParams = {
    target: string;
    route: string;
    parentConfig?: {
        route: string;
    };
};
type RouterRequestHandlersMap = Record<ExpressMethod, RequestHandler | undefined>;
type ErrorHandler = ErrorRequestHandler;
type RouterDirMiddleware = RequestHandler | RequestHandler[];
type RouterFileMiddleware = RouterDirMiddleware | PartialExpressMethodRecord<RouterDirMiddleware>;
type RouterFileError = ErrorHandler | PartialExpressMethodRecord<ErrorHandler | undefined> | undefined;
type DirRouteContext = {
    config: RouteConfig;
    middlewares: RequestHandler[];
    errorHandler: ErrorHandler | undefined;
};
type FileRouteContext = {
    config: RouteConfig;
    middlewares: RouterFileMiddleware;
    errorHandler: RouterFileError;
};
type RouterEndpoint = {
    depth: number;
    name: string;
    endpoint: string;
    method: string;
    middlewares: string[];
    errorHandler: string;
};
type RouterEndpoints = RouterEndpoint[];

export type { DirRouteConfig, DirRouteContext, DirsHandlerConfig, ErrorHandler, ExpressMethod, FileBasedRoutingOptions, FileRouteContext, FilesHandlerConfig, MapRoutesParams, PartialExpressMethodRecord, RouteConfig, RouterDirMiddleware, RouterEndpoint, RouterEndpoints, RouterFileError, RouterFileMiddleware, RouterRequestHandlersMap };
