import { URL } from "url";
import FormData from "form-data";
export interface GotenbergClient {
  post: (
    url: string,
    data: FormData,
    headers?: {
      [header: string]: number | string | string[] | void,
      ...
    }
  ) => Promise<NodeJS$ReadableStream>;
  get?: (url: string) => Promise<NodeJS$ReadableStream>;
}
export interface GotenbergClientFunction {
  (config?: { [key: string]: any }): GotenbergClient;
}
export interface GotenbergClientClass {
  new(config?: { [key: string]: any }): GotenbergClient;
}
export type CommonRequestFields = {
  waitTimeout?: number,
  webhookURL?: string,
  webhookURLTimeout?: number,
  resultFilename?: string,
  ...
};
export type ChromeRequestFields = {
  waitDelay?: number,
  googleChromeRpccBufferSize?: number,
  ...
};
export type HtmlRequestFields = {
  paperWidth?: number,
  paperHeight?: number,
  marginTop?: number,
  marginBottom?: number,
  marginLeft?: number,
  marginRight?: number,
  landscape?: boolean,
  pageRanges?: string,
  scale?: number,
  ...
};
export type MarkdownRequestFields = HtmlRequestFields;
export type OfficeRequestFields = {
  landscape?: boolean,
  pageRanges?: string,
  ...
};
export type UrlRequestFields = {
  ...HtmlRequestFields,
  ...{
    remoteURL?: string,
    ...
  },
};
export type MergeRequestFields = { ... };
export type RequestFields = {
  ...CommonRequestFields,
  ...UrlRequestFields,
  ...HtmlRequestFields,
  ...MergeRequestFields,
  ...OfficeRequestFields,
  ...ChromeRequestFields,
  ...MarkdownRequestFields,
};
export type FieldsModifier = (fields: RequestFields) => void;
export type PaperOptions =
  | [number, number]
  | {
      width?: number,
      height?: number,
      ...
    };
export type MarginOptions =
  | [number, number, number, number]
  | {
      top?: number,
      right?: number,
      bottom?: number,
      left?: number,
      ...
    };
export type ConversionOptions =
  | PaperOptions
  | MarginOptions
  | FieldsModifier
  | {
      ...HtmlRequestFields,
      ...OfficeRequestFields,
      ...MarkdownRequestFields,
      ...{
        paper?: PaperOptions,
        ...
      },
      ...{
        margins?: MarginOptions,
        ...
      },
    };
export type FileURI = string;
export type PlainSource = string | Buffer | FileURI | NodeJS$ReadableStream;
export type TupleSource = [string, PlainSource];
export type ObjectSource = {
  [name: string]: PlainSource,
  ...
};
export type Source =
  | URL
  | PlainSource
  | TupleSource
  | ObjectSource
  | Array<PlainSource | TupleSource | ObjectSource>
  | Iterable<PlainSource | TupleSource | ObjectSource>;
export type TupleStreamsSource = [string, NodeJS$ReadableStream];
export type HeadersModifier = (headers: HttpHeaders) => void;
export type HttpHeaders = {
  [header: string]: number | string,
  ...
};
declare export var RequestType: {|
  +Url: 0, // 0
  +Ping: 1, // 1
  +Html: 2, // 2
  +Merge: 3, // 3
  +Office: 4, // 4
  +Markdown: 5, // 5
  +Undefined: 6, // 6
|};
export type Request = {
  type: $Values<typeof RequestType>,
  url: string,
  client: GotenbergClient,
  source?: Source,
  fields: RequestFields,
  headers?: HttpHeaders,
  ...
};
export type UrlRequest = {
  ...Request,
  ...{
    type: typeof RequestType.Url,
    ...
  },
};
export type PingRequest = {
  ...Request,
  ...{
    type: typeof RequestType.Ping,
    ...
  },
};
export type HtmlRequest = {
  ...Request,
  ...{
    type: typeof RequestType.Html,
    ...
  },
};
export type MergeRequest = {
  ...Request,
  ...{
    type: typeof RequestType.Merge,
    ...
  },
};
export type OfficeRequest = {
  ...Request,
  ...{
    type: typeof RequestType.Office,
    ...
  },
};
export type MarkdownRequest = {
  ...Request,
  ...{
    type: typeof RequestType.Markdown,
    ...
  },
};
export type TypedRequest =
  | UrlRequest
  | PingRequest
  | HtmlRequest
  | MergeRequest
  | OfficeRequest
  | MarkdownRequest;
