import { Console } from "console";
import { InspectOptions } from "util";
import { StackTraceConfig } from "jest-message-util";
import { WriteStream } from "tty";
import { Config } from "@jest/types";

//#region src/types.d.ts
/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */
type LogMessage = string;
type LogEntry = {
  message: LogMessage;
  origin: string;
  type: LogType;
};
type LogType = 'assert' | 'count' | 'debug' | 'dir' | 'dirxml' | 'error' | 'group' | 'groupCollapsed' | 'info' | 'log' | 'time' | 'warn';
type ConsoleBuffer = Array<LogEntry>;
//#endregion
//#region src/BufferedConsole.d.ts
declare class BufferedConsole extends Console {
  private readonly _buffer;
  private _counters;
  private _timers;
  private _groupDepth;
  Console: typeof Console;
  constructor();
  static write(this: void, buffer: ConsoleBuffer, type: LogType, message: LogMessage, stackLevel?: number): ConsoleBuffer;
  private _log;
  assert(value: unknown, message?: string | Error): void;
  count(label?: string): void;
  countReset(label?: string): void;
  debug(firstArg: unknown, ...rest: Array<unknown>): void;
  dir(firstArg: unknown, options?: InspectOptions): void;
  dirxml(firstArg: unknown, ...rest: Array<unknown>): void;
  error(firstArg: unknown, ...rest: Array<unknown>): void;
  group(title?: string, ...rest: Array<unknown>): void;
  groupCollapsed(title?: string, ...rest: Array<unknown>): void;
  groupEnd(): void;
  info(firstArg: unknown, ...rest: Array<unknown>): void;
  log(firstArg: unknown, ...rest: Array<unknown>): void;
  time(label?: string): void;
  timeEnd(label?: string): void;
  timeLog(label?: string, ...data: Array<unknown>): void;
  warn(firstArg: unknown, ...rest: Array<unknown>): void;
  getBuffer(): ConsoleBuffer | undefined;
}
//#endregion
//#region src/CustomConsole.d.ts
type Formatter = (type: LogType, message: LogMessage) => string;
declare class CustomConsole extends Console {
  private readonly _stdout;
  private readonly _stderr;
  private readonly _formatBuffer;
  private _counters;
  private _timers;
  private _groupDepth;
  Console: typeof Console;
  constructor(stdout: WriteStream, stderr: WriteStream, formatBuffer?: Formatter);
  private _log;
  private _logError;
  assert(value: unknown, message?: string | Error): asserts value;
  count(label?: string): void;
  countReset(label?: string): void;
  debug(firstArg: unknown, ...args: Array<unknown>): void;
  dir(firstArg: unknown, options?: InspectOptions): void;
  dirxml(firstArg: unknown, ...args: Array<unknown>): void;
  error(firstArg: unknown, ...args: Array<unknown>): void;
  group(title?: string, ...args: Array<unknown>): void;
  groupCollapsed(title?: string, ...args: Array<unknown>): void;
  groupEnd(): void;
  info(firstArg: unknown, ...args: Array<unknown>): void;
  log(firstArg: unknown, ...args: Array<unknown>): void;
  time(label?: string): void;
  timeEnd(label?: string): void;
  timeLog(label?: string, ...data: Array<unknown>): void;
  warn(firstArg: unknown, ...args: Array<unknown>): void;
  getBuffer(): undefined;
}
//#endregion
//#region src/NullConsole.d.ts
declare class NullConsole extends CustomConsole {
  assert(): void;
  debug(): void;
  dir(): void;
  error(): void;
  info(): void;
  log(): void;
  time(): void;
  timeEnd(): void;
  timeLog(): void;
  trace(): void;
  warn(): void;
  group(): void;
  groupCollapsed(): void;
  groupEnd(): void;
}
//#endregion
//#region src/getConsoleOutput.d.ts
declare function getConsoleOutput(buffer: ConsoleBuffer, config: StackTraceConfig, globalConfig: Config.GlobalConfig): string;
//#endregion
export { BufferedConsole, ConsoleBuffer, CustomConsole, LogEntry, LogMessage, LogType, NullConsole, getConsoleOutput };