import {MQTTAcceptor} from './acceptors/mqtt-acceptor';
import {Tracer} from '../util/tracer';
import {TCPAcceptor} from './acceptors/tcp-acceptor';
import {Logger} from 'omelox-logger';
import {EventEmitter} from 'events';
import {MsgPkg} from './dispatcher';
import * as Gateway from './gateway';
// let acceptor from ('./acceptors/ws2-acceptor');

export interface ProcessMsgCallBack {
    (err: Error|null, ... args: any[]): void;
}
export type AcceptorCallback = (tracer: Tracer, msg: MsgPkg, cb: ProcessMsgCallBack) => void;


export interface IAcceptorFactory {
    (opts: Gateway.RpcServerOpts, cb: AcceptorCallback): IAcceptor;
}

export interface AcceptorOpts {
    interval?: number;
    bufferMsg?: boolean;
    rpcLogger?: Logger;
    rpcDebugLog?: boolean;
    pkgSize?: number;
    tracer?: Tracer;
    ping?: number;
}

export interface IAcceptor {
    close(): void;
    listen(port: number): void;
    on(event: 'error', cb: (err: Error, self: IAcceptor) => void): this;
    on(event: 'closed', cb: () => void): this;
}

export function createDefaultAcceptor(opts: AcceptorOpts, cb: AcceptorCallback): IAcceptor {
    return new MQTTAcceptor(opts, cb);
}

export function createTcpAcceptor(opts: AcceptorOpts, cb: AcceptorCallback): IAcceptor {
    return new TCPAcceptor(opts, cb);
}