import { Request, RequestHandler, Response } from 'express';
import { z, ZodType } from 'zod';
import { OpenAPIV3_1 } from 'openapi-types';
import { Method, ResolverTypes } from '../types/types';
import { HttpStatusCodes } from '../types/http-status-codes';
export declare type HandlerRequest<Params extends ZodType | unknown, Query extends ZodType | unknown, Body extends ZodType | unknown> = {
    params?: Params extends ZodType ? Params : never;
    query?: Query extends ZodType ? Query : never;
    body?: Body extends ZodType ? Body : never;
};
export declare type HandlerResponse = {
    [key in keyof HttpStatusCodes]?: ZodType;
};
export interface RequestSchemasContext<Params extends ZodType | unknown, Query extends ZodType | unknown, Body extends ZodType | unknown> {
    params: Params extends ZodType ? z.infer<Params> : never;
    query: Query extends ZodType ? z.infer<Query> : never;
    body: Body extends ZodType ? z.infer<Body> : never;
}
export declare type ResolverArgs<Params extends ZodType | unknown, Query extends ZodType | unknown, Body extends ZodType | unknown, ResolverType extends ResolverTypes> = ResolverType extends 'controlled' ? {
    ctx: RequestSchemasContext<Params, Query, Body>;
    req: Request;
} : {
    ctx: RequestSchemasContext<Params, Query, Body>;
    req: Request;
    res: Response;
};
export declare type ResolverReturnType<ResolverType extends ResolverTypes, ResponseSchema extends HandlerResponse> = {
    [key in keyof HandlerResponse]?: ResolverType extends 'controlled' ? ResponseSchema[key] extends ZodType ? z.infer<ResponseSchema[key]> : never : any;
};
export interface HandlerOptions<Params extends ZodType | unknown, Query extends ZodType | unknown, Body extends ZodType | unknown, ResolverType extends ResolverTypes, ResponseSchema extends HandlerResponse = HandlerResponse> {
    id: string;
    method: Method;
    request?: HandlerRequest<Params, Query, Body>;
    response: ResponseSchema;
    middlewares?: RequestHandler[];
    resolverType?: ResolverType;
    resolver: (args: ResolverArgs<Params, Query, Body, ResolverType>) => ResolverType extends 'controlled' ? ResolverReturnType<ResolverType, ResponseSchema> | Promise<ResolverReturnType<ResolverType, ResponseSchema>> : any;
}
interface CreateHandlerReturnType {
    _id: string;
    _getOpenApiSchemas: () => OpenAPIV3_1.SchemaObject;
    _getOpenApiPathItem: () => OpenAPIV3_1.PathItemObject;
    _middlewares: RequestHandler[];
    _handlerFunc: RequestHandler;
}
export declare function createHandler<Params extends ZodType | unknown, Query extends ZodType | unknown, Body extends ZodType | unknown, ResolverType extends ResolverTypes = 'controlled', ResponseSchema extends HandlerResponse = HandlerResponse>(options: HandlerOptions<Params, Query, Body, ResolverType, ResponseSchema>): CreateHandlerReturnType;
export {};
//# sourceMappingURL=create-handler.d.ts.map