import { LogLevelType, LogLayerTransport, LogLayerTransportParams } from '@loglayer/shared';
export { LogLayerTransport, LogLayerTransportParams, LogLevel, LogLevelPriority, LogLevelType } from '@loglayer/shared';

/**
 * Logging methods that are common to logging libraries
 */
interface LoggerLibrary {
    info(...data: any[]): void;
    warn(...data: any[]): void;
    error(...data: any[]): void;
    trace?: (...data: any[]) => void;
    debug(...data: any[]): void;
    fatal?: (...data: any[]) => void;
}
interface LoggerlessTransportConfig {
    /**
     * A user-defined identifier for the transport
     */
    id?: string;
    /**
     * If false, the transport will not send logs to the logger.
     * Default is true.
     */
    enabled?: boolean;
    /**
     * If true, the transport will log to the console for debugging purposes
     */
    consoleDebug?: boolean;
    /**
     * Minimum log level to process. Defaults to "trace".
     */
    level?: LogLevelType;
}
interface LogLayerTransportConfig<LogLibrary> extends Omit<LoggerlessTransportConfig, "level"> {
    /**
     * The logging library instance to use for logging
     */
    logger: LogLibrary;
}

/**
 * For implementing libraries that are logging libraries that generally have an interface of:
 * info(), warn(), error(), debug(), trace(), etc.
 *
 * @see {@link https://loglayer.dev/transports/creating-transports.html | Creating Transports}
 */
declare abstract class BaseTransport<LogLibrary> implements LogLayerTransport<LogLibrary> {
    /**
     * An identifier for the transport. If not defined, a random one will be generated.
     */
    id?: string;
    /**
     * Instance of the logger library
     */
    protected logger: LogLibrary;
    /**
     * If false, the transport will not send logs to the logger.
     */
    enabled: boolean;
    /**
     * If true, the transport will log to the console for debugging purposes
     */
    protected consoleDebug?: boolean;
    constructor(config: LogLayerTransportConfig<LogLibrary>);
    /**
     * LogLayer calls this to send logs to the transport
     */
    _sendToLogger(params: LogLayerTransportParams): void;
    /**
     * Returns the logger instance attached to the transport
     */
    getLoggerInstance(): LogLibrary;
    /**
     * Sends the log data to the logger for transport
     */
    abstract shipToLogger(params: LogLayerTransportParams): any[];
}

/**
 * For implementing libraries that aren't logging libraries
 *
 * @see {@link https://loglayer.dev/transports/creating-transports.html | Creating Transports}
 */
declare abstract class LoggerlessTransport implements LogLayerTransport {
    /**
     * An identifier for the transport. If not defined, a random one will be generated.
     */
    id?: string;
    /**
     * If false, the transport will not send logs to the logger.
     */
    enabled: boolean;
    /**
     * Minimum log level to process. Defaults to "trace".
     */
    level?: LogLevelType;
    /**
     * If true, the transport will log to the console for debugging purposes
     */
    protected consoleDebug?: boolean;
    constructor(config: LoggerlessTransportConfig);
    /**
     * LogLayer calls this to send logs to the transport
     */
    _sendToLogger(params: LogLayerTransportParams): void;
    /**
     * Returns the logger instance attached to the transport
     */
    getLoggerInstance(): void;
    /**
     * Sends the log data to the logger for transport
     */
    abstract shipToLogger(params: LogLayerTransportParams): any[];
}

/**
 * Shows what the logging library output looks like under a transport
 * @param label A name for the test
 * @param logLayerInstance The loglayer instance to use for logging
 */
declare function testTransportOutput(label: string, logLayerInstance: any): void;

export { BaseTransport, type LogLayerTransportConfig, type LoggerLibrary, LoggerlessTransport, type LoggerlessTransportConfig, testTransportOutput };
