import type { AnyJson, JsonMap } from '../../common/jsonTypes';
import type { Metadata } from '../../dsl/message';
import type { Rules } from '../../v3/types';
export type MessageContents = {
    content: AnyJson | Buffer;
};
export type Comment = string;
export type CustomComment = {
    key: string;
    value: string;
};
export interface SynchronousMessage {
    Request: MessageContents;
    Response: MessageContents[];
}
export interface AsynchronousMessage {
    contents: MessageContents;
    metadata: Metadata;
}
export interface PluginConfig {
    plugin: string;
    version: string;
}
export interface TransportConfig {
    port: number;
    address: string;
}
export type V4AsynchronousMessageBuilderFunc = (builder: V4AsynchronousMessageBuilder) => void;
export type V4MessageRequestBuilderFunc = (builder: V4SynchronousMessageWithRequestBuilder) => void;
export type V4MessageResponseBuilderFunc = (builder: V4SynchronousMessageWithResponseBuilder) => void;
export interface V4SynchronousPact {
    addSynchronousMessage(description: string): V4UnconfiguredSynchronousMessage;
}
export interface V4UnconfiguredSynchronousMessage {
    given(state: string, parameters?: JsonMap): V4UnconfiguredSynchronousMessage;
    pending(pending?: boolean): V4UnconfiguredSynchronousMessage;
    comment(comment: Comment | CustomComment): V4UnconfiguredSynchronousMessage;
    testName(name: string): V4UnconfiguredSynchronousMessage;
    reference(group: string, name: string, value: string): V4UnconfiguredSynchronousMessage;
    usingPlugin(config: PluginConfig): V4SynchronousMessageWithPlugin;
    withRequest(r: V4MessageRequestBuilderFunc): V4SynchronousMessageWithRequest;
}
export interface V4SynchronousMessageWithPlugin {
    usingPlugin(config: PluginConfig): V4SynchronousMessageWithPlugin;
    withPluginContents(contents: string, contentType: string): V4SynchronousMessageWithPluginContents;
}
export interface V4Message {
    withMetadata(metadata: Metadata): V4Message;
}
export interface V4SynchronousMessageWithRequestBuilder {
    withContent(contentType: string, body: Buffer): V4SynchronousMessageWithRequestBuilder;
    withJSONContent(content: unknown): V4SynchronousMessageWithRequestBuilder;
    withMatchingRules(rules: Rules): V4SynchronousMessageWithRequestBuilder;
}
export interface V4SynchronousMessageWithRequest {
    withResponse(builder: V4MessageResponseBuilderFunc): V4SynchronousMessageWithResponse;
}
export interface V4SynchronousMessageWithResponseBuilder {
    withMetadata(metadata: Metadata): V4SynchronousMessageWithResponseBuilder;
    withContent(contentType: string, body: Buffer): V4SynchronousMessageWithResponseBuilder;
    withJSONContent(content: unknown): V4SynchronousMessageWithResponseBuilder;
    withMatchingRules(rules: Rules): V4SynchronousMessageWithResponseBuilder;
}
export interface V4SynchronousMessageWithPluginContents {
    executeTest<T>(integrationTest: (m: SynchronousMessage) => Promise<T>): Promise<T | undefined>;
    startTransport(transport: string, address: string, config?: AnyJson): V4SynchronousMessageWithTransport;
}
export interface V4SynchronousMessageWithTransport {
    executeTest<T>(integrationTest: (tc: TransportConfig, m: SynchronousMessage) => Promise<T>): Promise<T | undefined>;
}
export interface V4SynchronousMessageWithResponse {
    executeTest<T>(integrationTest: (m: SynchronousMessage) => Promise<T>): Promise<T | undefined>;
}
export interface V4UnconfiguredAsynchronousMessage {
    given(state: string, parameters?: JsonMap): V4UnconfiguredAsynchronousMessage;
    pending(pending?: boolean): V4UnconfiguredAsynchronousMessage;
    comment(comment: Comment | CustomComment): V4UnconfiguredAsynchronousMessage;
    testName(name: string): V4UnconfiguredAsynchronousMessage;
    reference(group: string, name: string, value: string): V4UnconfiguredAsynchronousMessage;
    usingPlugin(config: PluginConfig): V4AsynchronousMessageWithPlugin;
    expectsToReceive(description: string, contents: V4AsynchronousMessageBuilderFunc): V4AsynchronousMessageWithContent;
}
export interface V4AsynchronousMessageWithPlugin {
    usingPlugin(config: PluginConfig): V4AsynchronousMessageWithPlugin;
    expectsToReceive(description: string): V4AsynchronousMessageWithPlugin;
    withPluginContents(contents: string, contentType: string): V4AsynchronousMessageWithPluginContents;
}
export interface V4AsynchronousMessageWithPluginContents {
    executeTest<T>(integrationTest: (m: AsynchronousMessage) => Promise<T>): Promise<T | undefined>;
    startTransport(transport: string, address: string, config?: AnyJson): V4AsynchronousMessageWithTransport;
}
export interface V4AsynchronousMessageWithTransport {
    executeTest<T>(integrationTest: (tc: TransportConfig, m: AsynchronousMessage) => Promise<T>): Promise<T | undefined>;
}
export interface V4AsynchronousMessageWithContent {
    executeTest<T>(integrationTest: (m: AsynchronousMessage) => Promise<T>): Promise<T | undefined>;
}
export interface V4AsynchronousMessageBuilder {
    withMetadata(metadata: Metadata): V4AsynchronousMessageBuilder;
    withContent(contentType: string, body: Buffer): V4AsynchronousMessageBuilder;
    withJSONContent(content: unknown): V4AsynchronousMessageBuilder;
    withMatchingRules(rules: Rules): V4AsynchronousMessageBuilder;
}
