import { Response, Express, Request } from 'express';
import { Options, RateLimitRequestHandler } from 'express-rate-limit';
import { RoleEnum, PermissionEnum, FormFieldsEnum, ResponseCodeEnum, ResponseStatusEnum } from 'zaions-tool-kit';
import { ZodObject, ZodEffects, z } from 'zod';

interface IExpressRateLimiterOptions extends Partial<Options> {
}
interface IConfigureZETKOptions {
    rateLimiterOptions?: IExpressRateLimiterOptions;
}
interface IApiResponse extends Response<any, Record<string, any>> {
}
interface IAuthCheckResultGeneric<A, B> {
    user: A;
    userRecord: B;
    isAdmin: boolean;
    isPlayer: boolean;
    isEngager: boolean;
    userId: string;
    userEmail: string;
    userPhoneNumber: string;
    userRole: RoleEnum;
    userPermissions: PermissionEnum[];
    [FormFieldsEnum.uniqueId]?: string;
}

declare const configureZETK: (options: IConfigureZETKOptions) => void;

interface IApplyMiddlewareOptions {
    applyCors?: boolean;
    expressJson?: boolean;
    expressUrlEncoded?: boolean;
    applyRateLimiter?: boolean;
    expressRateLimiter?: RateLimitRequestHandler;
}

declare const applyMiddlewaresOnApp: (expressApp: Express, { applyCors, expressJson, expressUrlEncoded, applyRateLimiter, expressRateLimiter, }: IApplyMiddlewareOptions) => void;
declare const invalidRequestHandler: (app: Express) => void;

declare const sendApiResponse: (res: Response, options?: {
    success?: boolean;
    message?: string;
    data?: unknown;
    dataList?: unknown;
    authToken?: unknown;
    errors?: unknown;
    code?: ResponseCodeEnum;
    status?: ResponseStatusEnum;
}) => Response;
declare const sendApiSuccessResponse: (res: Response, options?: {
    message?: string;
    data?: unknown;
    dataList?: unknown;
    authToken?: unknown;
    code?: ResponseCodeEnum;
    status?: ResponseStatusEnum;
}) => Response;
declare const sendApiFailedResponse: (res: Response, options?: {
    message?: string;
    errors?: unknown;
    code?: ResponseCodeEnum;
    status?: ResponseStatusEnum;
}) => Response;
declare const sendBadRequestResponse: (res: Response, options?: {
    message?: string;
    errors?: unknown;
    code?: ResponseCodeEnum;
    status?: ResponseStatusEnum;
}) => Response;
declare const sendUnAuthenticatedErrorResponse: (res: Response, options?: {
    message?: string;
    errors?: unknown;
    code?: ResponseCodeEnum;
    status?: ResponseStatusEnum;
}) => Response;
declare const sendUnAuthorizedErrorResponse: (res: Response, options?: {
    message?: string;
    errors?: unknown;
    code?: ResponseCodeEnum;
    status?: ResponseStatusEnum;
}) => Response;
declare const sendNotFoundErrorResponse: (res: Response, options?: {
    message?: string;
    errors?: unknown;
    code?: ResponseCodeEnum;
    status?: ResponseStatusEnum;
}) => Response;
declare const sendTooManyRequestsErrorResponse: (res: Response, options?: {
    message?: string;
    errors?: unknown;
    code?: ResponseCodeEnum;
    status?: ResponseStatusEnum;
}) => Response;
declare const sendItemExistsErrorResponse: (res: Response, options?: {
    message?: string;
    errors?: unknown;
    code?: ResponseCodeEnum;
    status?: ResponseStatusEnum;
}) => Response;

declare const isApiResponse: (value: any) => value is Response;

declare const getExpressRateLimiterOptions: () => IExpressRateLimiterOptions | null;
declare const setExpressRateLimiterOptions: (_options: IExpressRateLimiterOptions) => void;

declare const validateRequestInputData: <T extends object>({ req, res, validationSchema, }: {
    req: Request;
    validationSchema: ZodObject<any> | ZodEffects<any>;
    res: Response;
}) => Promise<T | Response>;

declare const registerRequestValidationSchema: z.ZodEffects<z.ZodObject<{
    name: z.ZodString;
    email: z.ZodString;
    password: z.ZodString;
    passwordConfirmation: z.ZodString;
}, 'strip', z.ZodTypeAny, {
    name: string;
    email: string;
    password: string;
    passwordConfirmation: string;
}, {
    name: string;
    email: string;
    password: string;
    passwordConfirmation: string;
}>, {
    name: string;
    email: string;
    password: string;
    passwordConfirmation: string;
}, {
    name: string;
    email: string;
    password: string;
    passwordConfirmation: string;
}>;
declare const loginRequestValidationSchema: z.ZodObject<{
    email: z.ZodString;
    password: z.ZodString;
}, 'strip', z.ZodTypeAny, {
    email: string;
    password: string;
}, {
    email: string;
    password: string;
}>;

export { type IApiResponse, type IApplyMiddlewareOptions, type IAuthCheckResultGeneric, type IConfigureZETKOptions, type IExpressRateLimiterOptions, applyMiddlewaresOnApp, configureZETK, getExpressRateLimiterOptions, invalidRequestHandler, isApiResponse, loginRequestValidationSchema, registerRequestValidationSchema, sendApiFailedResponse, sendApiResponse, sendApiSuccessResponse, sendBadRequestResponse, sendItemExistsErrorResponse, sendNotFoundErrorResponse, sendTooManyRequestsErrorResponse, sendUnAuthenticatedErrorResponse, sendUnAuthorizedErrorResponse, setExpressRateLimiterOptions, validateRequestInputData };
