import { v2, client } from '@datadog/datadog-api-client';
import { Writable } from 'node:stream';

type LogMessageBuilder<T = Record<string, unknown>> = (log: T) => v2.HTTPLogItem;
type LogStreamConfig<T = Record<string, unknown>> = {
    ddClientConfig?: Parameters<typeof client.createConfiguration>[0];
    ddServerConfig?: {
        site?: string;
        subdomain?: string;
        protocol?: string;
    };
    ddSource?: string;
    ddTags?: string;
    service?: string;
    sendIntervalMs?: number;
    batchSize?: number;
    logMessageBuilder?: LogMessageBuilder<T>;
    debug?: boolean;
};

declare class DataDogWritableStream<T = Record<string, unknown>> extends Writable {
    private readonly config;
    apiInstance: v2.LogsApi;
    batch: v2.HTTPLogItem[];
    timer?: NodeJS.Timeout;
    flushJob?: Promise<void>;
    constructor(config: {
        ddClientConfig?: Parameters<typeof client.createConfiguration>[0];
        ddServerConfig?: {
            site?: string;
            subdomain?: string;
            protocol?: string;
        };
        sendIntervalMs?: number;
        batchSize?: number;
        debug?: boolean;
        logMessageBuilder: LogMessageBuilder<T>;
    });
    _write(item: string | string[] | object, _encoding: unknown, callback: (err?: Error | null) => void): Promise<void>;
    _final(callback: (err?: Error | null) => void): Promise<void>;
    flush(batch: v2.HTTPLogItem[]): Promise<void>;
}

export { DataDogWritableStream };
export type { LogMessageBuilder, LogStreamConfig };
