import { Logger as Logger$1, LogLevel } from '@sapphire/framework';
import * as Colorette from 'colorette';
import { Timestamp } from '@sapphire/timestamp';

/**
 * Logger utility that applies a style to a string.
 * @since 1.0.0
 */
declare class LoggerStyle {
    readonly style: Colorette.Color;
    constructor(resolvable?: LoggerStyleResolvable);
    /**
     * Applies the style to a string.
     * @since 1.0.0
     * @param string The value to apply the style to.
     */
    run(string: string | number): string;
}
/**
 * The options for {@link LoggerStyle}.
 * @since 1.0.0
 */
interface LoggerStyleOptions {
    /**
     * The text effects, e.g. `italic`, `strikethrough`, etc.
     * @since 1.0.0
     */
    effects?: LoggerStyleEffect[];
    /**
     * The text color, e.g. `red` or `yellow`.
     * @since 1.0.0
     */
    text?: LoggerStyleText;
    /**
     * The background color, e.g. `magenta` or `red`.
     * @since 1.0.0
     */
    background?: LoggerStyleBackground;
}
/**
 * The value accepted by {@link LoggerStyle}'s constructor. Read `colorette`'s documentation for more information.
 * @since 1.0.0
 * @seealso https://www.npmjs.com/package/colorette
 */
type LoggerStyleResolvable = Colorette.Color | LoggerStyleOptions;
/**
 * The text styles.
 * @since 1.0.0
 */
declare enum LoggerStyleEffect {
    Reset = "reset",
    Bold = "bold",
    Dim = "dim",
    Italic = "italic",
    Underline = "underline",
    Inverse = "inverse",
    Hidden = "hidden",
    Strikethrough = "strikethrough"
}
/**
 * The text colors.
 * @since 1.0.0
 */
declare enum LoggerStyleText {
    Black = "black",
    Red = "red",
    Green = "green",
    Yellow = "yellow",
    Blue = "blue",
    Magenta = "magenta",
    Cyan = "cyan",
    White = "white",
    Gray = "gray",
    BlackBright = "blackBright",
    RedBright = "redBright",
    GreenBright = "greenBright",
    YellowBright = "yellowBright",
    BlueBright = "blueBright",
    MagentaBright = "magentaBright",
    CyanBright = "cyanBright",
    WhiteBright = "whiteBright"
}
/**
 * The background colors.
 * @since 1.0.0
 */
declare enum LoggerStyleBackground {
    Black = "bgBlack",
    Red = "bgRed",
    Green = "bgGreen",
    Yellow = "bgYellow",
    Blue = "bgBlue",
    Magenta = "bgMagenta",
    Cyan = "bgCyan",
    White = "bgWhite",
    BlackBright = "bgBlackBright",
    RedBright = "bgRedBright",
    GreenBright = "bgGreenBright",
    YellowBright = "bgYellowBright",
    BlueBright = "bgBlueBright",
    MagentaBright = "bgMagentaBright",
    CyanBright = "bgCyanBright",
    WhiteBright = "bgWhiteBright"
}

/**
 * Logger utility that formats a timestamp.
 * @since 1.0.0
 */
declare class LoggerTimestamp {
    /**
     * The timestamp used to format the current date.
     * @since 1.0.0
     */
    timestamp: Timestamp;
    /**
     * Whether or not the logger will show a timestamp in UTC.
     * @since 1.0.0
     */
    utc: boolean;
    /**
     * The logger style to apply the color to the timestamp.
     * @since 1.0.0
     */
    color: LoggerStyle | null;
    /**
     * The final formatter.
     * @since 1.0.0
     */
    formatter: LoggerTimestampFormatter;
    constructor(options?: LoggerTimestampOptions);
    /**
     * Formats the current time.
     * @since 1.0.0
     */
    run(): string;
}
/**
 * The options for {@link LoggerTimestamp}.
 * @since 1.0.0
 */
interface LoggerTimestampOptions {
    /**
     * The {@link Timestamp} pattern.
     * @since 1.0.0
     * @default 'YYYY-MM-DD HH:mm:ss'
     * @example
     * ```typescript
     * 'YYYY-MM-DD HH:mm:ss'
     * // 2020-12-23 22:01:10
     * ```
     */
    pattern?: string;
    /**
     * Whether or not the date should be UTC.
     * @since 1.0.0
     * @default false
     */
    utc?: boolean;
    /**
     * The color to use.
     * @since 1.0.0
     * @default colorette.reset
     */
    color?: LoggerStyleResolvable | null;
    /**
     * The formatter. See {@link LoggerTimestampFormatter} for more information.
     * @since 1.0.0
     * @default (value) => `${value} - `
     */
    formatter?: LoggerTimestampFormatter;
}
/**
 * The formatter used for {@link LoggerTimestampOptions}. This will be run **after** applying the color to the formatter.
 * @since 1.0.0
 */
interface LoggerTimestampFormatter {
    /**
     * @param timestamp The output of {@link LoggerStyle.run} on {@link Timestamp.display}/{@link Timestamp.displayUTC}.
     * @since 1.0.0
     */
    (timestamp: string): string;
}

/**
 * Logger utility that stores and applies a full style into the message.
 * @since 1.0.0
 */
declare class LoggerLevel {
    /**
     * The timestamp formatter.
     * @since 1.0.0
     */
    timestamp: LoggerTimestamp | null;
    /**
     * The infix, added between the timestamp and the message.
     * @since 1.0.0
     */
    infix: string;
    /**
     * The style formatter for the message.
     * @since 1.0.0
     */
    message: LoggerStyle | null;
    constructor(options?: LoggerLevelOptions);
    run(content: string): string;
}
/**
 * The options for {@link LoggerLevel}.
 * @since 1.0.0
 */
interface LoggerLevelOptions {
    /**
     * The timestamp options. Set to `null` to disable timestamp parsing.
     * @since 1.0.0
     * @default {}
     */
    timestamp?: LoggerTimestampOptions | null;
    /**
     * The infix to be included between the timestamp and the message.
     * @since 1.0.0
     * @default ''
     */
    infix?: string;
    /**
     * The style options for the message.
     * @since 1.0.0
     * @default colorette.clear
     */
    message?: LoggerStyleResolvable | null;
}

/**
 * The logger class.
 * @since 1.0.0
 */
declare class Logger extends Logger$1 {
    /**
     * The console this writes to.
     * @since 1.0.0
     */
    readonly console: Console;
    /**
     * The formats supported by the logger.
     * @since 1.0.0
     */
    readonly formats: Map<LogLevel, LoggerLevel>;
    /**
     * The string `write` will join values by.
     * @since 1.0.0
     */
    readonly join: string;
    /**
     * The inspect depth when logging objects.
     * @since 1.0.0
     */
    readonly depth: number;
    constructor(options?: LoggerOptions);
    /**
     * Writes the log message given a level and the value(s).
     * @param level The log level.
     * @param values The values to log.
     */
    write(level: LogLevel, ...values: readonly unknown[]): void;
    /**
     * Pre-processes an array of values.
     * @since 1.0.0
     * @param values The values to pre-process.
     */
    protected preprocess(values: readonly unknown[]): string;
    private get levels();
    /**
     * Gets whether or not colorette is enabled.
     * @since 1.0.0
     */
    static get stylize(): boolean;
    private static createFormatMap;
    private static ensureDefaultLevel;
}
/**
 * The logger options.
 * @since 1.0.0
 */
interface LoggerOptions {
    /**
     * A writable stream for the output logs.
     * @since 1.0.0
     * @default process.stdout
     */
    stdout?: NodeJS.WritableStream;
    /**
     * A writable stream for the error logs.
     * @since 1.0.0
     * @default process.stderr
     */
    stderr?: NodeJS.WritableStream;
    /**
     * The default options used to fill all the possible values for {@link LoggerOptions.format}.
     * @since 1.0.0
     * @default options.format.none ?? {}
     */
    defaultFormat?: LoggerLevelOptions;
    /**
     * The options for each log level. LogLevel.None serves to set the default for all keys, where only
     * {@link LoggerTimestampOptions.timestamp} and {@link LoggerLevelOptions.prefix} would be overridden.
     * @since 1.0.0
     * @default {}
     */
    format?: LoggerFormatOptions;
    /**
     * The minimum log level.
     * @since 1.0.0
     * @default LogLevel.Info
     */
    level?: LogLevel;
    /**
     * The string that joins different messages.
     * @since 1.0.0
     * @default ' '
     */
    join?: string;
    /**
     * The inspect depth when logging objects.
     * @since 1.0.0
     * @default 0
     */
    depth?: number;
}
/**
 * The logger format options.
 * @since 1.0.0
 */
interface LoggerFormatOptions {
    /**
     * The logger options for the lowest log level, used when calling {@link ILogger.trace}.
     * @since 1.0.0
     */
    trace?: LoggerLevelOptions;
    /**
     * The logger options for the debug level, used when calling {@link ILogger.debug}.
     * @since 1.0.0
     */
    debug?: LoggerLevelOptions;
    /**
     * The logger options for the info level, used when calling {@link ILogger.info}.
     * @since 1.0.0
     */
    info?: LoggerLevelOptions;
    /**
     * The logger options for the warning level, used when calling {@link ILogger.warn}.
     * @since 1.0.0
     */
    warn?: LoggerLevelOptions;
    /**
     * The logger options for the error level, used when calling {@link ILogger.error}.
     * @since 1.0.0
     */
    error?: LoggerLevelOptions;
    /**
     * The logger options for the critical level, used when calling {@link ILogger.fatal}.
     * @since 1.0.0
     */
    fatal?: LoggerLevelOptions;
    /**
     * The logger options for an unknown or uncategorised level.
     * @since 1.0.0
     */
    none?: LoggerLevelOptions;
}

declare module '@sapphire/framework' {
    interface ClientLoggerOptions extends LoggerOptions {
    }
}
/**
 * The [@sapphire/plugin-logger](https://github.com/sapphiredev/plugins/blob/main/packages/logger) version that you are currently using.
 * An example use of this is showing it of in a bot information command.
 *
 * Note to Sapphire developers: This needs to explicitly be `string` so it is not typed as the string that gets replaced by esbuild
 */
declare const version: string;

export { Logger, type LoggerFormatOptions, LoggerLevel, type LoggerLevelOptions, type LoggerOptions, LoggerStyle, LoggerStyleBackground, LoggerStyleEffect, type LoggerStyleOptions, type LoggerStyleResolvable, LoggerStyleText, LoggerTimestamp, type LoggerTimestampFormatter, type LoggerTimestampOptions, version };
