import type { Server } from './universal/server';
import type { Cookie, ElysiaCookie } from './cookies';
import type { StatusMap, InvertedStatusMap, redirect as Redirect } from './utils';
import { ElysiaCustomStatusResponse, status, type SelectiveStatus } from './error';
import type { RouteSchema, Prettify, ResolvePath, SingletonBase, HTTPHeaders, InputSchema } from './types';
type InvertedStatusMapKey = keyof InvertedStatusMap;
type CheckExcessProps<T, U> = 0 extends 1 & T ? T : U extends U ? Exclude<keyof T, keyof U> extends never ? T : {
    [K in keyof U]: U[K];
} & {
    [K in Exclude<keyof T, keyof U>]: never;
} : never;
export type ErrorContext<in out Route extends RouteSchema = {}, in out Singleton extends SingletonBase = {
    decorator: {};
    store: {};
    derive: {};
    resolve: {};
}, Path extends string | undefined = undefined> = Prettify<{
    body: Route['body'];
    query: undefined extends Route['query'] ? Record<string, string | undefined> : Route['query'];
    params: undefined extends Route['params'] ? Path extends `${string}/${':' | '*'}${string}` ? ResolvePath<Path> : {
        [key in string]: string;
    } : Route['params'];
    headers: undefined extends Route['headers'] ? Record<string, string | undefined> : Route['headers'];
    cookie: undefined extends Route['cookie'] ? Record<string, Cookie<string | undefined>> : Record<string, Cookie<string | undefined>> & {
        [key in keyof Route['cookie']]-?: NonNullable<Cookie<Route['cookie'][key]>>;
    };
    server: Server | null;
    redirect: Redirect;
    set: {
        headers: HTTPHeaders;
        status?: number | keyof StatusMap;
        redirect?: string;
        /**
         * ! Internal Property
         *
         * Use `Context.cookie` instead
         */
        cookie?: Record<string, ElysiaCookie>;
    };
    status: {} extends Route['response'] ? typeof status : <const Code extends keyof Route['response'] | InvertedStatusMap[Extract<InvertedStatusMapKey, keyof Route['response']>], T extends Code extends keyof Route['response'] ? Route['response'][Code] : Code extends keyof StatusMap ? Route['response'][StatusMap[Code]] : never>(code: Code, response: CheckExcessProps<T, Code extends keyof Route['response'] ? Route['response'][Code] : Code extends keyof StatusMap ? Route['response'][StatusMap[Code]] : never>) => ElysiaCustomStatusResponse<Code, T>;
    /**
     * Path extracted from incoming URL
     *
     * Represent a value extracted from URL
     *
     * @example '/id/9'
     */
    path: string;
    /**
     * Path as registered to router
     *
     * Represent a path registered to a router, not a URL
     *
     * @example '/id/:id'
     */
    route: string;
    request: Request;
    store: Singleton['store'];
} & Singleton['decorator'] & Singleton['derive'] & Singleton['resolve']>;
type PrettifyIfObject<T> = T extends object ? Prettify<T> : T;
export type Context<in out Route extends RouteSchema = {}, in out Singleton extends SingletonBase = {
    decorator: {};
    store: {};
    derive: {};
    resolve: {};
}, Path extends string | undefined = undefined> = Prettify<{
    body: PrettifyIfObject<Route['body'] & Singleton['resolve']['body']>;
    query: undefined extends Route['query'] ? {} extends NonNullable<Singleton['resolve']['query']> ? Record<string, string> : Singleton['resolve']['query'] : PrettifyIfObject<Route['query'] & Singleton['resolve']['query']>;
    params: undefined extends Route['params'] ? undefined extends Path ? {} extends NonNullable<Singleton['resolve']['params']> ? Record<string, string> : Singleton['resolve']['params'] : Path extends `${string}/${':' | '*'}${string}` ? ResolvePath<Path> : never : PrettifyIfObject<Route['params'] & Singleton['resolve']['params']>;
    headers: undefined extends Route['headers'] ? {} extends NonNullable<Singleton['resolve']['headers']> ? Record<string, string | undefined> : Singleton['resolve']['headers'] : PrettifyIfObject<Route['headers'] & Singleton['resolve']['headers']>;
    cookie: undefined extends Route['cookie'] ? Record<string, Cookie<unknown>> : Record<string, Cookie<unknown>> & Prettify<{
        [key in keyof Route['cookie']]-?: Cookie<Route['cookie'][key]>;
    } & {
        [key in keyof Singleton['resolve']['cookie']]-?: Cookie<Singleton['resolve']['cookie'][key]>;
    }>;
    server: Server | null;
    redirect: Redirect;
    set: {
        headers: HTTPHeaders;
        status?: number | keyof StatusMap;
        /**
         * @deprecated Use inline redirect instead
         *
         * @example Migration example
         * ```ts
         * new Elysia()
         *     .get(({ redirect }) => redirect('/'))
         * ```
         */
        redirect?: string;
        /**
         * ! Internal Property
         *
         * Use `Context.cookie` instead
         */
        cookie?: Record<string, ElysiaCookie>;
    };
    /**
     * Path extracted from incoming URL
     *
     * Represent a value extracted from URL
     *
     * @example '/id/9'
     */
    path: string;
    /**
     * Path as registered to router
     *
     * Represent a path registered to a router, not a URL
     *
     * @example '/id/:id'
     */
    route: string;
    request: Request;
    store: Singleton['store'];
    status: {} extends Route['response'] ? typeof status : SelectiveStatus<Route['response']>;
} & Singleton['decorator'] & Singleton['derive'] & Omit<Singleton['resolve'], keyof InputSchema>>;
export type PreContext<in out Singleton extends SingletonBase = {
    decorator: {};
    store: {};
    derive: {};
    resolve: {};
}> = Prettify<{
    store: Singleton['store'];
    request: Request;
    redirect: Redirect;
    server: Server | null;
    set: {
        headers: HTTPHeaders;
        status?: number;
        redirect?: string;
    };
    status: typeof status;
} & Singleton['decorator']>;
export {};
