import { Logger } from 'winston';
import { Kafka, Producer, logLevel, Consumer } from 'kafkajs';

type Callback1Void<Input> = (input: Input) => void;

declare abstract class BaseKafkaService<Child> {
    protected _logger: Logger | undefined;
    protected _host: string | undefined;
    protected _pollTimeInterval: number | undefined;
    protected _pollTimeout: number | undefined;
    protected _numConsumers: number | undefined;
    protected _topic: string | undefined;
    protected _group: string | undefined;
    protected _clientId: string | undefined;
    protected kafka: Kafka;
    protected producer: Producer | undefined;
    protected onNewMessageReceived: ((message: Record<string, string[]>) => void) | undefined;
    private consumers;
    protected constructor(host: string, clientId: string);
    setLogger(value: Logger): Child;
    setPollTimeInterval(value: number | undefined): Child;
    clientId(value: string | undefined): Child;
    setPollTimeout(value: number | undefined): Child;
    setNumConsumers(value: number | undefined): Child;
    setTopic(value: string | undefined): Child;
    setGroup(value: string | undefined): Child;
    disconnect(): void;
    toWinstonLogLevel: (level: logLevel) => "error" | "warn" | "info" | "debug";
    init(): Promise<void>;
    setUp(): void;
    protected abstract getThis(): Child;
    protected initSender(): Promise<void>;
    protected startPolling(): void;
    protected _poll(consumer: Consumer): Promise<void>;
    protected setOnMessageReceived(handler: Callback1Void<Record<string, string[]>>): Promise<void>;
    protected initConsumer(): Promise<void>;
}

interface QueueInterface<Entry> {
    send(key: string, message: Entry | Entry[]): void;
    init(): void;
    deInit(): void;
}

declare class KafkaQueueService<Entry> extends BaseKafkaService<KafkaQueueService<Entry>> implements QueueInterface<Entry> {
    constructor(host: string, clientId: string);
    send(key: string, message: Entry | Entry[]): Promise<void>;
    deInit(): void;
    onReceive(handler: Callback1Void<Record<string, Entry[]>>): Promise<KafkaQueueService<Entry>>;
    protected getThis(): KafkaQueueService<Entry>;
}

export { BaseKafkaService, KafkaQueueService, type QueueInterface };
