import { IncomingMessage, ServerResponse } from 'http';
import { NextHandleFunction } from 'connect';
import { HttpError } from 'http-errors';
import { F as FrameworkContract } from '../../framework.contract-td-lRvq6.cjs';
import { OptionsJson, Options, OptionsText, OptionsUrlencoded } from 'body-parser';

/**
 * The options for {@link BaseBodyParserFramework}
 *
 * @breadcrumb Frameworks / BodyParserFramework
 * @public
 */
type BodyParserOptions = {
    /**
     * Implements a custom way of handling error.
     *
     * @defaultValue {@link BaseBodyParserFramework.defaultHandleOnError}
     *
     * @example
     * ```typescript
     * customErrorHandler: (req: IncomingMessage, response: ServerResponse, error: HttpError<any>) => {
     *   response.setHeader('content-type', 'text/plain');
     *   response.statusCode = error.statusCode;
     *   // always call end to return the error
     *   response.end(error.message);
     * }
     * ```
     *
     * @param request - The referecene for request
     * @param response - The reference for response
     * @param error - The error throwed by body-parser
     */
    customErrorHandler?: (request: IncomingMessage, response: ServerResponse, error: HttpError<any>) => void;
};
/**
 * The base class used by other body-parser functions to parse a specific content-type
 *
 * @breadcrumb Frameworks / BodyParserFramework
 * @public
 */
declare class BaseBodyParserFramework<TApp> implements FrameworkContract<TApp> {
    protected readonly framework: FrameworkContract<TApp>;
    protected readonly middleware: NextHandleFunction;
    protected readonly options?: BodyParserOptions | undefined;
    /**
     * Default Constructor
     */
    protected constructor(framework: FrameworkContract<TApp>, middleware: NextHandleFunction, options?: BodyParserOptions | undefined);
    /**
     * The selected error handler
     */
    protected readonly errorHandler: NonNullable<BodyParserOptions['customErrorHandler']>;
    /**
     * {@inheritDoc}
     */
    sendRequest(app: TApp, request: IncomingMessage, response: ServerResponse): void;
    /**
     * Handle next execution called by the cors package
     */
    protected onBodyParserFinished(app: TApp, request: IncomingMessage, response: ServerResponse): () => void;
    /**
     * The default function to handle errors
     *
     * @param _request - The referecene for request
     * @param response - The reference for response
     * @param error - The error throwed by body-parser
     */
    protected defaultHandleOnError(_request: IncomingMessage, response: ServerResponse, error: HttpError<any>): void;
}

/**
 * The body-parser options for application/json
 *
 * @remarks {@link https://github.com/expressjs/body-parser#bodyparserjsonoptions}
 *
 * @breadcrumb Frameworks / BodyParserFramework / JsonBodyParserFramework
 * @public
 */
type JsonBodyParserFrameworkOptions = OptionsJson & BodyParserOptions;
/**
 * The body-parser class used to parse application/json.
 *
 * @breadcrumb Frameworks / BodyParserFramework / JsonBodyParserFramework
 * @public
 */
declare class JsonBodyParserFramework<TApp> extends BaseBodyParserFramework<TApp> implements FrameworkContract<TApp> {
    /**
     * Default Constructor
     */
    constructor(framework: FrameworkContract<TApp>, options?: JsonBodyParserFrameworkOptions);
}

/**
 * The body-parser options for application/octet-stream
 *
 * @remarks {@link https://github.com/expressjs/body-parser#bodyparserrawoptions}
 *
 * @breadcrumb Frameworks / BodyParserFramework / RawBodyParserFramework
 * @public
 */
type RawBodyParserFrameworkOptions = Options & BodyParserOptions;
/**
 * The body-parser class used to parse application/octet-stream.
 *
 * @breadcrumb Frameworks / BodyParserFramework / RawBodyParserFramework
 * @public
 */
declare class RawBodyParserFramework<TApp> extends BaseBodyParserFramework<TApp> implements FrameworkContract<TApp> {
    /**
     * Default Constructor
     */
    constructor(framework: FrameworkContract<TApp>, options?: RawBodyParserFrameworkOptions);
}

/**
 * The body-parser options for text/plain
 *
 * @remarks {@link https://github.com/expressjs/body-parser#bodyparsertextoptions}
 *
 * @breadcrumb Frameworks / BodyParserFramework / TextBodyParserFramework
 * @public
 */
type TextBodyParserFrameworkOptions = OptionsText & BodyParserOptions;
/**
 * The body-parser class used to parse text/plain.
 *
 * @breadcrumb Frameworks / BodyParserFramework / TextBodyParserFramework
 * @public
 */
declare class TextBodyParserFramework<TApp> extends BaseBodyParserFramework<TApp> implements FrameworkContract<TApp> {
    /**
     * Default Constructor
     */
    constructor(framework: FrameworkContract<TApp>, options?: TextBodyParserFrameworkOptions);
}

/**
 * The body parser options for application/x-www-form-urlencoded
 *
 * @remarks {@link https://github.com/expressjs/body-parser#bodyparserurlencodedoptions}
 *
 * @breadcrumb Frameworks / BodyParserFramework / UrlencodedBodyParserFramework
 * @public
 */
type UrlencodedBodyParserFrameworkOptions = OptionsUrlencoded & BodyParserOptions;
/**
 * The body-parser class used to parse application/x-www-form-urlencoded.
 *
 * @breadcrumb Frameworks / BodyParserFramework / UrlencodedBodyParserFramework
 * @public
 */
declare class UrlencodedBodyParserFramework<TApp> extends BaseBodyParserFramework<TApp> implements FrameworkContract<TApp> {
    /**
     * Default Constructor
     */
    constructor(framework: FrameworkContract<TApp>, options?: UrlencodedBodyParserFrameworkOptions);
}

export { BaseBodyParserFramework, type BodyParserOptions, JsonBodyParserFramework, type JsonBodyParserFrameworkOptions, RawBodyParserFramework, type RawBodyParserFrameworkOptions, TextBodyParserFramework, type TextBodyParserFrameworkOptions, UrlencodedBodyParserFramework, type UrlencodedBodyParserFrameworkOptions };
