import { IJsonSchemaAttribute } from "./structures/IJsonSchemaAttribute";
/**
 * Swagger v2.0 definition.
 *
 * @author Jeongho Nam - https://github.com/samchon
 */
export declare namespace SwaggerV2 {
    type Method = "get" | "post" | "put" | "delete" | "options" | "head" | "patch" | "trace";
    interface IDocument {
        swagger: "2.0" | `2.0.${number}`;
        info?: IDocument.IInfo;
        host?: string;
        basePath?: string;
        consumes?: string[];
        produces?: string[];
        definitions?: Record<string, IJsonSchema>;
        parameters?: Record<string, IOperation.IParameter>;
        responses?: Record<string, IOperation.IResponse>;
        securityDefinitions?: Record<string, ISecurityDefinition>;
        security?: Record<string, string[]>[];
        paths?: Record<string, IPath>;
        tags?: IDocument.ITag[];
    }
    namespace IDocument {
        interface IInfo {
            title: string;
            description?: string;
            termsOfService?: string;
            contact?: IContact;
            license?: ILicense;
            version: string;
        }
        interface IContact {
            name?: string;
            url?: string;
            email?: string;
        }
        interface ILicense {
            name: string;
            url?: string;
        }
        interface ITag {
            name: string;
            description?: string;
        }
    }
    interface IPath extends Partial<Record<Method, IOperation | undefined>> {
        parameters?: Array<IOperation.IParameter | IJsonSchema.IReference<`#/parameters/${string}`>>;
    }
    interface IOperation {
        operationId?: string;
        parameters?: Array<IOperation.IParameter | IJsonSchema.IReference<`#/definitions/parameters/${string}`>>;
        responses?: Record<string, IOperation.IResponse | IJsonSchema.IReference<`#/definitions/responses/${string}`>>;
        summary?: string;
        description?: string;
        security?: Record<string, string[]>[];
        tags?: string[];
        deprecated?: boolean;
    }
    namespace IOperation {
        type IParameter = IGeneralParameter | IBodyParameter;
        type IGeneralParameter = IJsonSchema & {
            name: string;
            in: string;
            description?: string;
        };
        interface IBodyParameter {
            schema: IJsonSchema;
            name: string;
            in: string;
            description?: string;
            required?: boolean;
        }
        interface IResponse {
            description?: string;
            headers?: Record<string, IJsonSchema>;
            schema?: IJsonSchema;
            example?: any;
        }
    }
    type IJsonSchema = IJsonSchema.IBoolean | IJsonSchema.IInteger | IJsonSchema.INumber | IJsonSchema.IString | IJsonSchema.IArray | IJsonSchema.IObject | IJsonSchema.IReference | IJsonSchema.IAnyOf | IJsonSchema.IOneOf | IJsonSchema.INullOnly | IJsonSchema.IUnknown;
    namespace IJsonSchema {
        interface IBoolean extends Omit<IJsonSchemaAttribute.IBoolean, "examples">, __ISignificant<"boolean"> {
            default?: boolean | null;
            enum?: Array<boolean | null>;
        }
        interface IInteger extends Omit<IJsonSchemaAttribute.IInteger, "examples">, __ISignificant<"integer"> {
            /** @type int64 */ default?: number | null;
            /** @type int64 */ enum?: Array<number | null>;
            /** @type int64 */ minimum?: number;
            /** @type int64 */ maximum?: number;
            exclusiveMinimum?: number | boolean;
            exclusiveMaximum?: number | boolean;
            /**
             * @type uint64
             * @exclusiveMinimum 0
             */
            multipleOf?: number;
        }
        interface INumber extends Omit<IJsonSchemaAttribute.INumber, "examples">, __ISignificant<"number"> {
            default?: number | null;
            enum?: Array<number | null>;
            minimum?: number;
            maximum?: number;
            exclusiveMinimum?: number | boolean;
            exclusiveMaximum?: number | boolean;
            /** @exclusiveMinimum 0 */ multipleOf?: number;
        }
        interface IString extends Omit<IJsonSchemaAttribute.IString, "examples">, __ISignificant<"string"> {
            default?: string | null;
            enum?: Array<string | null>;
            format?: "binary" | "byte" | "password" | "regex" | "uuid" | "email" | "hostname" | "idn-email" | "idn-hostname" | "iri" | "iri-reference" | "ipv4" | "ipv6" | "uri" | "uri-reference" | "uri-template" | "url" | "date-time" | "date" | "time" | "duration" | "json-pointer" | "relative-json-pointer" | (string & {});
            pattern?: string;
            /** @type uint64 */ minLength?: number;
            /** @type uint64 */ maxLength?: number;
        }
        interface IArray extends Omit<IJsonSchemaAttribute.IArray, "examples">, __ISignificant<"array"> {
            items: IJsonSchema;
            uniqueItems?: boolean;
            /** @type uint64 */ minItems?: number;
            /** @type uint64 */ maxItems?: number;
        }
        interface IObject extends Omit<IJsonSchemaAttribute.IObject, "examples">, __ISignificant<"object"> {
            properties?: Record<string, IJsonSchema>;
            required?: string[];
            additionalProperties?: boolean | IJsonSchema;
            maxProperties?: number;
            minProperties?: number;
        }
        interface IReference<Key = string> extends __IAttribute {
            $ref: Key;
        }
        interface IAllOf extends __IAttribute {
            allOf: IJsonSchema[];
        }
        interface IAnyOf extends __IAttribute {
            "x-anyOf": IJsonSchema[];
        }
        interface IOneOf extends __IAttribute {
            "x-oneOf": IJsonSchema[];
        }
        interface INullOnly extends __IAttribute {
            type: "null";
            default?: null;
        }
        interface IUnknown extends __IAttribute {
            type?: undefined;
        }
        interface __ISignificant<Type extends string> extends __IAttribute {
            type: Type;
            "x-nullable"?: boolean;
        }
        interface __IAttribute extends Omit<IJsonSchemaAttribute, "examples" | "writeOnly"> {
            examples?: any[];
        }
    }
    type ISecurityDefinition = ISecurityDefinition.IApiKey | ISecurityDefinition.IBasic | ISecurityDefinition.IOauth2Implicit | ISecurityDefinition.IOauth2AccessCode | ISecurityDefinition.IOauth2Password | ISecurityDefinition.IOauth2Application;
    namespace ISecurityDefinition {
        interface IApiKey {
            type: "apiKey";
            in?: "header" | "query" | "cookie";
            name?: string;
            description?: string;
        }
        interface IBasic {
            type: "basic";
            name?: string;
            description?: string;
        }
        interface IOauth2Implicit {
            type: "oauth2";
            flow: "implicit";
            authorizationUrl?: string;
            scopes?: Record<string, string>;
            description?: string;
        }
        interface IOauth2AccessCode {
            type: "oauth2";
            flow: "accessCode";
            authorizationUrl?: string;
            tokenUrl?: string;
            scopes?: Record<string, string>;
            description?: string;
        }
        interface IOauth2Password {
            type: "oauth2";
            flow: "password";
            tokenUrl?: string;
            scopes?: Record<string, string>;
            description?: string;
        }
        interface IOauth2Application {
            type: "oauth2";
            flow: "application";
            tokenUrl?: string;
            scopes?: Record<string, string>;
            description?: string;
        }
    }
}
